Android - автоматически прокручивать в AlertDialog TextView - PullRequest
0 голосов
/ 16 января 2019

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

Я могу привести AlertDialog к TextView (и, например, с помощью этого TextView изменить размер текста), но любые методы, включающие прокрутку, не работают.

Код:

LogFileView.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                try {
                    String logFile = "/data/data/com.test/test.log";
                    String logFileOutput = getFileOutput(logFile);
                    final AlertDialog dialog = new AlertDialog.Builder(getActivity()).setMessage(logFileOutput).show();
                    TextView textView = dialog.findViewById(android.R.id.message);
                    textView.setTextSize(8);
                    textView.scrollTo(0, textView.getLineCount());

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }); 

textView.setTextSize(8); изменит размер текста на дисплее

textView.scrollTo(0, textView.getLineCount()); ничего не сделает, и диалоговое окно с предупреждением, несмотря на наличие полосы прокрутки, останется сфокусированным на первой строке

Обновление 1:

Я вижу, что в выводе консоли есть несколько запросов на код / ​​ошибки создания диалогов.

Во-первых, я не использую отдельный макет / класс для создания диалога. Он применяет макет по умолчанию, связанный с (android.R.id.message), к экземпляру android.app.AlertDialog и создается только в методе onClick для onClickListener в приведенном выше коде.

Исходя из полученных мной отзывов, код, который я недавно пытался использовать, выглядит следующим образом:

LogFileView.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            try {
                String logFile = "/data/data/com.test/test.log";
                String logFileOutput = getFileOutput(logFile);
                final AlertDialog dialog = new AlertDialog.Builder(getActivity()).setMessage(logFileOutput).show();
                TextView textView = dialog.findViewById(android.R.id.message);
                textView.setTextSize(8);
                //textView.scrollTo(0, textView.getLineCount());
                textView.setMovementMethod(new ScrollingMovementMethod());
                textView.post(new Runnable() {
                    @Override
                    public void run() {
                        textView.scrollTo(0, textView.getLineCount());
                    }
                });

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

Во-вторых, при попытке прокрутки в консоли ничего не появляется - это просто игнорируется во время выполнения.

Компоновка по умолчанию казалась бы подходящей для моих целей, учитывая, что она выглядит как пустой TextView с прикрепленной полосой прокрутки, но я думаю, что следующим разумным шагом может быть использование нового пользовательского макета и добавление ScrollView и просмотр что происходит

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Используйте код ниже. Я проверен и проверен.

    textView.movementMethod = ScrollingMovementMethod() // Add this
    textView.text = "your text"
    textView.post {
        val scrollAmount = textView.layout.getLineTop(textView.lineCount) - textView.height
        textView.scrollTo(0, textView.lineCount)
    }

Edit: Эквивалент Java:

    textView.setMovementMethod(new ScrollingMovementMethod());
    textView.setText("your text");
    textView.post(new Runnable() {
        @Override
        public void run() {
            int scrollAmount = textView.getLayout().getLineTop(textView.getLineCount()) - textView.getHeight();
            textView.scrollTo(0, scrollAmount);
        }
    });
0 голосов
/ 16 января 2019

Попробуйте обернуть его post вместо прямого вызова scrollTo, что-то вроде этого:

textView.post(new Runnable() {
    @Override
    public void run() {
        textView.scrollTo(0, textView.getLineCount());
    }
});
...