Динамическая полоса прокрутки Textview не отображается - PullRequest
2 голосов
/ 30 мая 2019

Я создал текстовое представление динамически и хочу сделать его прокручиваемым.

final RelativeLayout.LayoutParams params = parseLayoutParams(
                frameMargins, context);
tv.setText(Utility.getpropertyString(controls.getText()));
final String textColor = Utility.getpropertyString(controls.getTextcolor());
tv.setTextColor(Color.parseColor(textColor));
tv.setTextSize(12);
tv.setGravity(Gravity.CENTER_VERTICAL);
tv.setTextSize(tSize);
tv.setEllipsize(TextUtils.TruncateAt.END);
tv.setMaxLines(controls.getMaxlines());
tv.setTag(controls.getTagId());
tv.setLayoutParams(params);
tv.setEllipsize(TextUtils.TruncateAt.END);
tv.setVisibility(controls.getVisibility());
tv.setVerticalScrollBarEnabled(isScrollable);
tv.setScroller(new Scroller(context));
tv.setMovementMethod(new ScrollingMovementMethod());         
tv.setScrollBarFadeDuration(0);

Но я не могу видеть полосу прокрутки в текстовом представлении ни когда ни прокручиваем, ни когда мы прокручиваем ее. Пожалуйста помоги!

Ответы [ 2 ]

4 голосов
/ 30 мая 2019

В Api 21 видимость полосы прокрутки View зарезервирована только для макетов XML, поскольку важная функция с именем initializaScrollBars была удалена из-за проблемы при передаче переменной TypeArray в качестве параметра.

Итак, чтобыВыполните то, что вам нужно программно, вы можете сделать это следующим образом

Создайте XML-макет с именем scrolltextview.xml

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

Теперь, чтобы создать его программно

    TextView tv = (TextView) LayoutInflater.from(this).inflate(R.layout.scrolltextview, null, false);
    // now decorate it as your needs
    tv.setText(m);
    tv.setTextColor(Color.BLUE);
    tv.setTextSize(23);
    ...
    tv.setMovementMethod(new ScrollingMovementMethod());

    // this is needed only if you want to show scrollbar also when text is not scrolling
    tv.setScrollBarFadeDuration(0);
    // thecontainer = the layout you want to add your new textview
    thecontainer.addView(tv);
1 голос
/ 12 июня 2019

Как отметил Ферран, initializeScrollBars () удалено.См. здесь , чтобы ознакомиться с отчетом об ошибке и обоснованием ее устранения.Насколько я могу судить, нет другого строго программного способа указать полосы прокрутки для представления.Все пути проходят через XML.: - (

Я думаю, что ответ Феррана - хороший путь: он работает, прост для понимания и должен быть легким для документирования. Однако существуют и другие способы программного создания TextView с полосами прокрутки с небольшой поддержкой стилей.

Для API 21 и выше Определите стиль с именем «ViewWithScrollBars» следующим образом:

<style name="ViewWithScrollbars">
    <item name="android:scrollbars">vertical</item>
</style>

Теперь мы можем использовать конструктор с четырьмя аргументами для TextView , чтобы применить стиль.

TextView tv = new TextView(this, null, 0, R.style.ViewWithScrollbars);

Этот метод создаст TextView с полосами прокрутки.Однако есть по крайней мере одна оговорка.Когда TextView создается с одним аргументом

new TextView(Context)

Конструктор выдвигает другие конструкторы, которые добавляют дополнительные аргументы.Один из этих конструкторов определен следующим образом:

public TextView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.textViewStyle);
}

Третий аргумент com.android.internal.R.attr.textViewStyle - это внутренний стиль Android, который выберет по умолчанию textViewStyle из темы.Вызов, который я предлагаю, использует ноль для третьего аргумента, поэтому любые textViewStyle , определенные в теме, не будут применены.

Разумным решением для этого может быть следующее:

tv = new TextView(this, null, android.R.attr.textViewStyle, R.style.ViewWithScrollbars);

К сожалению, если в теме определен третий аргумент ( defStyleAttr ), то четвертый аргумент ( defStyleRes ) не используется.В результате полосы прокрутки не появятся.

Если вы используете textViewStyle , вам придется внести изменения или просто использовать следующий подход.

Длявсе API Используя стиль "ViewWithScrollBars", описанный выше, мы можем определить ContextThemeWrapper, который будет устанавливать полосы прокрутки в тему, которая будет использоваться для создания TextView .

ContextThemeWrapper ctw = new ContextThemeWrapper(this, R.style.ViewWithScrollbars); // "this" is the Activity
tv = new TextView(ctw);

Я рекомендую васна статью Криса Бэйнса, озаглавленную «Тема против стиля» , в которой объясняется, как работают наложения тем.

Далее все это собрано.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = new TextView(this);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            // This will actually work for API 21 and above.
            ContextThemeWrapper ctw = new ContextThemeWrapper(this, R.style.ViewWithScrollbars);
            tv = new TextView(ctw);
        } else {
            tv = new TextView(this, null, 0, R.style.ViewWithScrollbars);
        }
        tv.setText(R.string.lorem);
        tv.setTextColor(Color.parseColor("red"));
        tv.setTextSize(12);
        tv.setGravity(Gravity.CENTER_VERTICAL);
        tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 24);
        tv.setEllipsize(TextUtils.TruncateAt.END);
        tv.setMaxLines(7);
        tv.setTag(View.generateViewId());
        RelativeLayout.LayoutParams params =
                new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
                        RelativeLayout.LayoutParams.WRAP_CONTENT);
        tv.setLayoutParams(params);
        tv.setEllipsize(TextUtils.TruncateAt.END);
        tv.setVisibility(View.VISIBLE);
        tv.setVerticalScrollBarEnabled(true);
        tv.setScroller(new Scroller(this));
        tv.setMovementMethod(new ScrollingMovementMethod());
        tv.setScrollBarFadeDuration(0);
        ((RelativeLayout) findViewById(R.id.layout)).addView(tv);
    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...