3

我的演示文稿终于奏效了。activity我的第一个屏幕有一个主屏幕,Presentation第二个屏幕有一个主屏幕。我的问题是,我无法更改演示视图中的内容。

TextView演示文稿显示在第二个屏幕上后,为什么我不能更改 a ?changeText("Test123")MainActivity我的应用程序崩溃时调用该方法。

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

}
4

2 回答 2

3

好吧,我查看了 LogCat。例外是:

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

我的代码在MainActivity另一个线程上运行。要从这里做 UI 工作,我需要使用runOnUiThread. 我在这个答案中找到了这个解决方案。

我的changeText方法现在看起来像这样:

public void changeText (String s) {

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

谢谢您的帮助!现在我知道如何使用 LogCat 来做类似的事情了。

于 2013-07-03T15:03:59.950 回答
1

您遇到此问题是因为演示文稿的上下文与包含 Activity 的上下文不同:

演示文稿在创建时与目标显示器相关联,并根据显示器的指标配置其上下文和资源配置。

值得注意的是,演示文稿的上下文与其包含的 Activity 的上下文不同。使用演示文稿自己的上下文扩展演示文稿的布局并加载其他资源以确保加载目标显示的正确大小和密度的资产,这一点很重要。

希望这也能证明您提到的解决方案是合理的。

于 2014-06-06T10:04:25.253 回答