我正在使用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并查看会发生什么
答案 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());
}
});