android جعل TextView التمرير على الروبوت




scroll android-textview (17)

هذا هو "كيفية تطبيق ScrollBar إلى 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"/>

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

<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>

هذا هو...

أقوم بعرض النص في عرض نصي يبدو طويلاً جدًا بحيث لا يمكن ملاءمته في شاشة واحدة. أحتاج إلى جعل برنامج 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);

أضف ما يلي في النص في XML.

android:scrollbars="vertical"

وأخيرًا ، أضف

textView.setMovementMethod(new ScrollingMovementMethod());

في ملف جافا.


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

  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);

اعتدت عليه لغرض السجل.

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


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

مجرد ضبط

android:maxLines = "AN_INTEGER"

android:scrollbars = "vertical"

خصائص TextView في ملف xml الخاص TextView .

ثم استخدام:

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" وإلا فلن تعمل scrollview! (لقد تسبب هذا لي تضيع ساعة فقط الآن! FFS).

نصيحة للمحترفين:

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

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());
        }
    });
}

يعمل الكود أدناه على إنشاء عرض نص تلقائي أفقي للتمرير:

أثناء إضافة TextView إلى xml

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

قم بتعيين الخصائص التالية لـ TextView في onCreate ()

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

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

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

استخدمه هكذا

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

أضف هذا إلى تنسيق 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());

في حالتي .Constraint Layout.AS 2.3.

تنفيذ الكود:

YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());

XML:

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

إذا كنت لا ترغب في استخدام حل EditText ، فقد يكون حظك أفضل في:

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

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

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

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

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


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

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

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

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


أنا ناضلت مع هذا لأكثر من أسبوع ، وأخيرا أحسب كيفية جعل هذا العمل!

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

هنا هو الحل الأسهل بكثير:

أنشئ ملفًا للفصل يسمى: "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


جعل النص الخاص بك فقط إضافة هذا

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

إذا كنت تريد تمرير النص داخل عرض النص ، فيمكنك اتباع ما يلي:

أولاً ، يجب أن يكون لديك نص من فئة فرعية.

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

فيما يلي مثال على عرض نصي تحت فئة فرعية.

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"
 />

هذا هو.


يمكنك إما

  1. تحيط TextView خلال ScrollView ؛ أو
  2. تعيين طريقة الحركة إلى ScrollingMovementMethod.getInstance(); .






android-textview