Android-在AlertDialog TextView中自动滚动

时间:2019-01-16 05:54:30

标签: android scroll textview alertdialog

我正在使用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的实例,并且仅在上述代码中的onClickListener的onClick方法中构造。

根据我到目前为止收到的反馈,我最近尝试使用的代码如下:

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 :(得分:2)

使用以下代码。我经过测试和验证。

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

编辑: 等同于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);
        }
    });

答案 1 :(得分:1)

尝试用post包装它,而不是直接调用scrollTo, 像这样的东西:

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