首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android -在AlertDialog TextView中自动滚动

问Android -在AlertDialog TextView中自动滚动
EN

Stack Overflow用户
提问于 2019-01-16 05:54:29
回答 2查看 574关注 0票数 1

我使用一个AlertDialog来跟踪一个实时更新的logFile,并且需要在添加额外的行时自动滚动到视图的底部。

我可以将AlertDialog转换为TextView (例如,使用此TextView更改文本大小),但是任何涉及滚动的方法都不起作用。

代码:

代码语言:javascript
复制
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方法中构造。

根据迄今收到的反馈,我最近尝试使用的代码如下所示:

代码语言:javascript
复制
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并看看会发生什么是明智的。

EN

回答 2

Stack Overflow用户

发布于 2019-01-16 07:09:18

使用下面的代码。我进行了测试和验证。

代码语言:javascript
复制
    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:

代码语言:javascript
复制
    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);
        }
    });
票数 2
EN

Stack Overflow用户

发布于 2019-01-16 06:19:12

尝试用post包装它,而不是直接调用scrollTo,如下所示:

代码语言:javascript
复制
textView.post(new Runnable() {
    @Override
    public void run() {
        textView.scrollTo(0, textView.getLineCount());
    }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54211139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档