سؤال

أقوم بعرض نص في طريقة عرض نصية تبدو طويلة جدا بحيث لا يمكن احتواؤها في شاشة واحدة.أحتاج إلى جعل TextView الخاص بي قابلاً للتمرير.كيف يمكنني أن أفعل ذلك؟

هنا هو الرمز:

final TextView tv = new TextView(this);
tv.setBackgroundResource(R.drawable.splash);
tv.setTypeface(face);
tv.setTextSize(18);
tv.setTextColor(R.color.BROWN);
tv.setGravity(Gravity.CENTER_VERTICAL| Gravity.CENTER_HORIZONTAL);
tv.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent e) {
        Random r = new Random();
        int i = r.nextInt(101);
        if (e.getAction() == e.ACTION_DOWN) {
            tv.setText(tips[i]);
            tv.setBackgroundResource(R.drawable.inner);
        }
        return true;
    }
});
setContentView(tv);
هل كانت مفيدة؟

المحلول

وأنت لا تحتاج إلى استخدام ScrollView الواقع.

ومجرد مجموعة

android:scrollbars = "vertical"

وخصائص TextView الخاصة بك في ملف xml التخطيط الخاص بك.

وبعد ذلك الاستخدام:

وyourTextView.setMovementMethod(new ScrollingMovementMethod());

في التعليمات البرمجية.

والبنغو، ومخطوطات!

نصائح أخرى

هذه هي الطريقة التي قمت بها في XML بحتة:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ScrollView
        android:id="@+id/SCROLLER_ID"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        android:fillViewport="true">

        <TextView
            android:id="@+id/TEXT_STATUS_ID"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1.0"/>
    </ScrollView>
</LinearLayout>

ملحوظات:

  1. android:fillViewport="true" مدموج مع android:layout_weight="1.0" سيجعل عرض النص يشغل كل المساحة المتاحة.

  2. عند تحديد Scrollview، لا تقم بتحديده android:layout_height="fill_parent" وإلا فإن التمرير لا يعمل!(وهذا ما جعلني أضيع ساعة الآن!جبهة القوى الاشتراكية).

نصيحة محترف:

للتمرير إلى الأسفل برمجيًا بعد إلحاق النص، استخدم هذا:

mTextStatus = (TextView) findViewById(R.id.TEXT_STATUS_ID);
mScrollView = (ScrollView) findViewById(R.id.SCROLLER_ID);

private void scrollToBottom()
{
    mScrollView.post(new Runnable()
    {
        public void run()
        {
            mScrollView.smoothScrollTo(0, mTextStatus.getBottom());
        }
    });
}

وكل ما هو ضروري حقا هو setMovementMethod (). وهنا مثال باستخدام LinearLayout.

تحليل الملف <م> main.xml

تحليل
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:id="@+id/tv1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:text="@string/hello"
    />
</LinearLayout>

تحليل الملف <م> WordExtractTest.java

تحليل
public class WordExtractTest extends Activity {

    TextView tv1;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv1 = (TextView)findViewById(R.id.tv1);

        loadDoc();
    }

    private void loadDoc() {

        String s = "";

        for(int x=0; x<=100; x++) {
            s += "Line: " + String.valueOf(x) + "\n";
        }

        tv1.setMovementMethod(new ScrollingMovementMethod());

        tv1.setText(s);
    }
}

تأكد textview الخاص بك فقط إضافة هذا

TextView textview= (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(new ScrollingMovementMethod());

وليس من الضروري أن يضع في

android:Maxlines="AN_INTEGER"`

ويمكنك القيام عملك ببساطة عن طريق إضافة:

android:scrollbars = "vertical"

و، وضع هذا الرمز في فئة جافا بك:

textview.setMovementMethod(new ScrollingMovementMethod());

يمكنك إما

  1. تحيط TextView بواسطة أ ScrollView;أو
  2. اضبط طريقة الحركة على ScrollingMovementMethod.getInstance();.

وأفضل طريقة وجدت:

واستبدال TextView مع EDITTEXT مع هذه سمات إضافية:

android:background="@null"
android:editable="false"
android:cursorVisible="false"

وليس هناك حاجة للالتفاف في ScrollView.

وهذا هو "كيفية تطبيق شريط التمرير إلى TextView بك"، وذلك باستخدام XML الوحيد.

أولا، تحتاج إلى اتخاذ تحكم Textview في main.xml الملف وكتابة بعض النصوص في ذلك ... مثل هذا:

<TextView
    android:id="@+id/TEXT"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="@string/long_text"/>

وبعد ذلك، وضع عنصر التحكم عرض النص في بين scrollview لعرض شريط التمرير لهذا النص:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent">

    <ScrollView
        android:id="@+id/ScrollView01"
        android:layout_height="150px"
        android:layout_width="fill_parent">

        <TextView
            android:id="@+id/TEXT"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/long_text"/>

    </ScrollView>
</RelativeLayout>

وهذا كل شيء ...

بسيط.هذه هي الطريقة التي فعلت ذلك:

  1. جانب XML:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        tools:context="com.mbh.usbcom.MainActivity">
        <TextView
            android:id="@+id/tv_log"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:text="Log:" />
    </RelativeLayout>
    
  2. جانب جافا:

    tv_log = (TextView) findViewById(R.id.tv_log);
    tv_log.setMovementMethod(new ScrollingMovementMethod());
    

علاوة:

للسماح بعرض النص بالتمرير لأسفل بينما يملأه النص، عليك إضافة:

    android:gravity="bottom"

إلى ملف TextView xml.سيتم التمرير لأسفل تلقائيًا عند وصول المزيد من النص.

بالطبع تحتاج إلى إضافة النص باستخدام وظيفة الإلحاق بدلاً من تعيين النص:

    tv_log.append("\n" + text);

لقد استخدمته لغرض السجل.

آمل أن يساعد هذا ؛)

"النصيحة الاحترافية" أعلاه من شخص ما في مكان ما (جعل TextView قابلاً للتمرير على Android) يعمل بشكل رائع، ولكن ماذا لو كنت تضيف نصًا ديناميكيًا إلى ScrollView وترغب في التمرير تلقائيًا إلى الأسفل بعد الإلحاق فقط عندما يكون المستخدم في الجزء السفلي من ScrollView؟(ربما لأنه إذا قام المستخدم بالتمرير لأعلى لقراءة شيء ما، فلن ترغب في إعادة تعيينه تلقائيًا إلى الأسفل أثناء الإلحاق، وهو ما قد يكون مزعجًا.)

على أية حال، هنا هو:

if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <=
        (mScrollView.getHeight() + mTextStatus.getLineHeight())) {
    scrollToBottom();
}

سوف يعمل mTextStatus.getLineHeight() على جعله لا يقوم بالتمرير إلى Bottom() إذا كان المستخدم ضمن سطر واحد من نهاية ScrollView.

وهذا سيوفر سلاسة التمرير النص مع شريط التمرير.

ScrollView scroller = new ScrollView(this);
TextView tv = new TextView(this);
tv.setText(R.string.my_text);
scroller.addView(tv);

إذا كنت تريد النص المراد تمريره داخل textview، ثم يمكنك اتباع ما يلي:

أولا يجب عليك أن textview فرعية.

وثم استخدام ذلك.

وفيما يلي مثال على textview subclassed.

public class AutoScrollableTextView extends TextView {

    public AutoScrollableTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setEllipsize(TruncateAt.MARQUEE);
        setMarqueeRepeatLimit(-1);
        setSingleLine();
        setHorizontallyScrolling(true);
    }

    public AutoScrollableTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setEllipsize(TruncateAt.MARQUEE);
        setMarqueeRepeatLimit(-1);
        setSingleLine();
        setHorizontallyScrolling(true);
    }

    public AutoScrollableTextView(Context context) {
        super(context);
        setEllipsize(TruncateAt.MARQUEE);
        setMarqueeRepeatLimit(-1);
        setSingleLine();
        setHorizontallyScrolling(true);
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        if(focused)
            super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }

    @Override
    public void onWindowFocusChanged(boolean focused) {
        if(focused)
            super.onWindowFocusChanged(focused);
    }

    @Override
    public boolean isFocused() {
        return true;
    }
}

والآن، لديك لاستخدام ذلك في XML بهذه الطريقة:

 <com.yourpackagename.AutoScrollableTextView
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="This is very very long text to be scrolled"
 />

وهذا كل شيء.

وأنا لم تجد TextView التمرير لدعم "قذف" لفتة، حيث يستمر التمرير بعد نفض الغبار صعودا أو هبوطا. انتهى بي الأمر تنفيذ ذلك بنفسي لأنني لم ترغب في استخدام ScrollView لأسباب مختلفة، وهناك لا يبدو أن هناك MovementMethod أن كلا سمح لي لتحديد النص وانقر على وصلات.

وأضف ما يلي في textview في XML.

android:scrollbars="vertical"

وأخيرا، إضافة

textView.setMovementMethod(new ScrollingMovementMethod());

في ملف جافا.

عند الانتهاء مع للتمرير، إضافة هذا الخط إلى السطر الأخير في طريقة العرض عند إدخال أي شيء في وجهة النظر:

((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);

وهذا إضافة إلى تخطيط XML الخاصة بك:

android:ellipsize="marquee"
android:focusable="false"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:text="To Make An textView Scrollable Inside The TextView Using Marquee"

وفي التعليمات البرمجية لديك لكتابة الأسطر التالية:

textview.setSelected(true);
textView.setMovementMethod(new ScrollingMovementMethod());

إذا كنت لا تريد استخدام الحل EDITTEXT ثم قد يكون لديك أفضل حظا مع:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.yourLayout);
    (TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance());
}

ورمز أدناه يخلق التمرير الأفقي التلقائي textview:

وحين اضاف TextView استخدام XML

<TextView android:maxLines="1" 
          android:ellipsize="marquee"
          android:scrollHorizontally="true"/>

وتعيين الخصائص التالية من TextView في OnCreate الخاص ()

tv.setSelected(true);
tv.setHorizontallyScrolling(true); 

واستخدام مثل هذا

<TextView  
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:maxLines = "AN_INTEGER"
    android:scrollbars = "vertical"
/>

في kotlin لجعل textview للتمرير

myTextView.movementMethod= ScrollingMovementMethod()

ووأيضا إضافة في أكس هذا العقار

    android:scrollbars = "vertical"

في بلدي case.Constraint Layout.AS 2.3.

وتنفيذ الرمز:

YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());

وXML:

android:scrollbars="vertical"
android:scrollIndicators="right|end"

ووضع maxLines وscrollbars داخل TextView في أكس.

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    android:maxLines="5" // any number of max line here.
    />

وبعد ذلك في التعليمات البرمجية جافا.

وtextView.setMovementMethod(new ScrollingMovementMethod());

كان

ولي هذه المشكلة عندما كنت تستخدم TextView داخل ScrollView. عملت هذا الحل بالنسبة لي.

scrollView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                description.getParent().requestDisallowInterceptTouchEvent(false);

                return false;
            }
        });

        description.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                description.getParent().requestDisallowInterceptTouchEvent(true);

                return false;
            }
        });

كلما كنت في حاجة إلى ذلك استخدم ScrollView كأصل, ويمكنك أيضًا استخدام طريقة حركة التمرير مع TextView.

وعندما صورة إلى المناظر الطبيعية لجهازك في ذلك الوقت تحدث بعض المشكلات.(مثل) الصفحة بأكملها قابلة للتمرير ولكن طريقة حركة التمرير لا تعمل.

إذا كنت لا تزال بحاجة إلى استخدام ScrollView كطريقة رئيسية أو لحركة التمرير، فيمكنك أيضًا استخدام الوصف أدناه.

إذا لم تكن لديك أية مشكلات، فيمكنك استخدام EditText بدلاً من TextView

انظر أدناه :

<EditText
     android:id="@+id/description_text_question"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:background="@null"
     android:editable="false"
     android:cursorVisible="false"
     android:maxLines="6"/>

هنا يتصرف EditText مثل TextView

وسيتم حل مشكلتك

وXML - يمكنك استخدام android:scrollHorizontally السمة

وإذا ما سمح النص لتكون أوسع من العرض (وبالتالي يمكن تمريره أفقيا).

قد يكون قيمة منطقية، مثل "صحيح" أو "كاذبة".

وPrigramacaly - setHorizontallyScrolling(boolean)

وجرب هذا:

android:scrollbars = "vertical"

لقد كافحت مع هذا لأكثر من أسبوع واكتشفت أخيرًا كيفية إنجاز هذا العمل!

كانت مشكلتي هي أن كل شيء سيتم تمريره على أنه "كتلة".كان النص نفسه يتم تمريره، ولكن كقطعة بدلاً من سطرًا تلو الآخر.من الواضح أن هذا لم ينجح بالنسبة لي، لأنه سيؤدي إلى قطع الخطوط في الأسفل.جميع الحلول السابقة لم تنجح معي، لذلك قمت بتصميم حل خاص بي.

إليك الحل الأسهل حتى الآن:

قم بإنشاء ملف فئة يسمى:"PerfectScrollableTextView" داخل الحزمة، ثم انسخ هذا الرمز والصقه في:

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.TextView;

public class PerfectScrollableTextView extends TextView {

    public PerfectScrollableTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setVerticalScrollBarEnabled(true);
        setHorizontallyScrolling(false);
    }

    public PerfectScrollableTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setVerticalScrollBarEnabled(true);
        setHorizontallyScrolling(false);
    }

    public PerfectScrollableTextView(Context context) {
        super(context);
        setVerticalScrollBarEnabled(true);
        setHorizontallyScrolling(false);
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        if(focused)
            super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }

    @Override
    public void onWindowFocusChanged(boolean focused) {
        if(focused)
            super.onWindowFocusChanged(focused);
    }

    @Override
    public boolean isFocused() {
        return true;
    }
}

أخيرًا قم بتغيير "TextView" الخاص بك في XML:

من: <TextView

ل: <com.your_app_goes_here.PerfectScrollableTextView

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top