Выполнить код после установки действительно большой строки в TextView - PullRequest
0 голосов
/ 08 мая 2018
<ScrollView
        android:id="@+id/readScrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/readTextView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</ScrollView>    

это образец XML-файла.

ScrollView readScroll = findViewById(R.id.readScrollView);
TextView readTextView = findViewById(R.id.readTextView);
String largeText = So Large Text;    // up to megabytes.

readTextView.setText(largeText);     // So large that it spend some time.
Log.e("amount", readScrollView.getMaxScrollAmount());    // This Code return 0

Моя проблема - возвращение журнала 0.

Я думаю, это потому, что Log был выполнен до setText() завершения этой работы. Поэтому я попытался использовать нить и использовать Thread.join(), это не работает.

Я уже проверил "Правильно ли запущен getMaxScrollAmount() метод?" с onClickListener, этот метод работает правильно и возвращает 1280.

Как запустить Log.e("amount", readScrollView.getMaxScrollAmount()); этот код после полного завершения setText Code ??

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я решил проблему с этим кодом.

readFile(path)
readScroll.post(new Runnable() {
    @Override
    public void run() {
        readScroll.setScrollY(process);
    }
});

тогда я могу запустить readScroll.setScrollY(process); после того, как полностью закончится readFile(path).

0 голосов
/ 08 мая 2018

Попробуйте этот код:

mScrollView = findViewById(R.id.content_scroll);
mContentTxt = findViewById(R.id.content_txt);

mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        mScrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);

        // MaxScrollAmount return non-zero
        int maxScrollAmount = mScrollView.getMaxScrollAmount();
    }
});

mContentTxt.setText("Long string here");

По сути, вы слушаете измененный макет ScrollViewer, который вызывается после того, как его дочерние представления изменяют его размер. Зарегистрируйте событие прямо перед setText и отмените регистрацию при первом вызове.

...