Как отметил Ферран, 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);
}
}