Полоса прокрутки Dynamic Textview не отображается

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

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
0
1 243
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Начиная с API 21, видимость полосы прокрутки «Просмотр» зарезервирована только для макетов 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);
Ответ принят как подходящий

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

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

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

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

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

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

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

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

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

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

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

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

}

Другие вопросы по теме