nick_j_white
nick_j_white

Reputation: 622

Android - automatically scroll within AlertDialog TextView

I am using an AlertDialog to track a logFile which is updating in real time, and need to automatically scroll to the bottom of the view whenever an extra line is added.

I am able to cast the AlertDialog to a TextView (and e.g. using this TextView alter the text size) but any methods involving scrolling don't work.

Code:

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); will alter the text size on display

textView.scrollTo(0, textView.getLineCount()); will do nothing, and the alert dialog, despite having a scrollbar available, will remain focussed on the first line

Update 1:

I see there are a few requests for the dialog creation code/errors in the console output.

Firstly, I am not actually using a separate layout/class to create the dialog. It is applying the default layout associated with (android.R.id.message) to an instance of android.app.AlertDialog and is only constructed within the onClick method for the onClickListener in the code above.

Based on the feedback I've received so far, the code I've most recently attempted to use looks as follows:

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

Secondly, there is nothing appearing in the console when the scroll attempt is made - this simply gets ignored at runtime.

The default layout seemed like it would be fine for my purpose, given it appears like a blank TextView with a scrollbar attached, but I think it may be a sensible next step to use a new custom layout and add a ScrollView and see what happens

Upvotes: 1

Views: 843

Answers (2)

Pragya Singla
Pragya Singla

Reputation: 254

Use below code. I Tested & verified.

    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: Equivalent to 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);
        }
    });

Upvotes: 2

Raz Tourgman
Raz Tourgman

Reputation: 567

Try to wrap it with post instead of calling directly to scrollTo, something like this:

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

Upvotes: 1

Related Questions