我的演讲终于工作了。我的第一个屏幕有一个主activity
,第二个屏幕有一个Presentation
。
我的问题是,我无法更改演示文稿视图中的内容。
为什么在第二个屏幕上显示演示文稿后无法更改TextView
?
调用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);
}
答案 0 :(得分:2)
好吧,我查看了LogCat。 例外是:
E/AndroidRuntime(13950): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
我MainActivity
中的代码在另一个线程上运行。要从这里做UI工作,我需要使用runOnUiThread
。我在this回答中找到了这个解决方案。
我的changeText
方法现在看起来像这样:
public void changeText (String s) {
runOnUiThread(new Runnable() {
public void run() {
presentationActivity.setImageView(position);
}
});
}
感谢您的帮助!现在我知道如何使用LogCat做类似的事情。
答案 1 :(得分:1)
您遇到此问题是因为演示文稿的上下文与包含活动的内容不同:
演示文稿在创建时与目标显示相关联 并根据配置其上下文和资源配置 显示指标。
值得注意的是,演示文稿的上下文与上下文不同 它的含有活动。膨胀a的布局是很重要的 使用演示文稿自己演示和加载其他资源 上下文,以确保资产的正确大小和密度 目标显示已加载。
希望这也证明了你提到的解决方案。