جعل TextView قابلاً للتمرير على Android
سؤال
أقوم بعرض نص في طريقة عرض نصية تبدو طويلة جدا بحيث لا يمكن احتواؤها في شاشة واحدة.أحتاج إلى جعل 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>
ملحوظات:
android:fillViewport="true"
مدموج معandroid:layout_weight="1.0"
سيجعل عرض النص يشغل كل المساحة المتاحة.عند تحديد 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());
يمكنك إما
- تحيط
TextView
بواسطة أScrollView
;أو - اضبط طريقة الحركة على
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>
وهذا كل شيء ...
بسيط.هذه هي الطريقة التي فعلت ذلك:
جانب 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>
جانب جافا:
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