Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Presentation Class - How to make changes on the Presentation View dynamically

My presentation is working finally. I have one main activity for my first screen and one Presentation for my second Screen. My problem is, that I can't change the content on my presentation view.

Why can't I change a TextView after the presentation is shown on the second screen? Calling the method changeText("Test123") in the MainActivity crashes my app.

public class MainActivity extends Activity {

    private PresentationActivity presentationActivity;

    protected void onCreate(Bundle savedInstanceState) {    

        super.onCreate(savedInstanceState);  


        // init Presentation Class

        DisplayManager displayManager = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
        Display[] presentationDisplays = displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
        if (presentationDisplays.length > 0) {
            // If there is more than one suitable presentation display, then we could consider
            // giving the user a choice.  For this example, we simply choose the first display
            // which is the one the system recommends as the preferred presentation display.
            Display display = presentationDisplays[0];
            PresentationActivity presentation = new PresentationActivity(this, display);
            presentation.show();

            this.presentationActivity =  presentation;    
        }
    }

    public void changeText (String s) {

        this.presentationActivity.setText(s);

    }
}



public class PresentationActivity extends Presentation {

    private TextView text;



    private PresentationActivity presentation;


public PresentationActivity(Context outerContext, Display display) {
    super(outerContext, display);
    // TODO Auto-generated constructor stub

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     

    setContentView(R.layout.activity_presentation);   

    TextView text = (TextView) findViewById(R.id.textView1);

    this.text = text;
    // works fine:
    text.setText("test");      

}

public void setText(String s){

    // error
    this.text.setText(s);

}
like image 863
user1972807 Avatar asked Feb 19 '26 17:02

user1972807


1 Answers

Well, I looked in the LogCat. The exception was:

E/AndroidRuntime(13950): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

The code in my MainActivity runs on another thread. To do UI work from here I need to use runOnUiThread. This solution I found in this answer.

My changeText methode looks like this now:

public void changeText (String s) {

        runOnUiThread(new Runnable() {
          public void run() {
              presentationActivity.setImageView(position);
          }
    });
}

Thanks for the help! Now I know how to use LogCat for things like that.

like image 80
user1972807 Avatar answered Feb 22 '26 06:02

user1972807



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!