【问题标题】:How can i have a permanent reference to a view? (android)我怎样才能永久引用视图? (安卓)
【发布时间】:2012-01-22 01:14:15
【问题描述】:

我在 xml 中有一个布局。

在我的活动中,在 onCreate 方法中,我得到了对我想要定期更新的视图的引用,如下所示:

TextView myText = (TextView)findViewById(R.id.textview1);

然后,在一个周期性的方法中,我这样做:

myText.setText(Float.toString(myData));

它工作正常,直到屏幕旋转。

我读到当屏幕旋转时,布局被重新创建,并且布局上的所有视图都被重新创建,所以旧的引用不起作用。

我的代码:

private TextView myText; //Its a class member

public void onCreate(Bundle savedInstanceState) {
   //Other things
   myText = (TextView)findViewById(R.id.textview1);
   //Other things
}

//This is the periodic method, it occurs many times per second
public final void onSensorChanged(SensorEvent event) {
   myText.setText(Float.toString(event.myData)); 
   //This setText works fine until the screen rotation
}

我怎样才能永久引用视图? 我怎么知道屏幕什么时候旋转了?

感谢

【问题讨论】:

  • “旧参考不起作用”是什么意思?你有例外吗?
  • 在上面的代码中,“myText”存储了对 TextView 的引用。但是当屏幕旋转时,该 TextView 被销毁,并且其他 TextView 在新布局中替换它(在旋转发生时创建),因此 myText 现在引用了一个不存在的 TextView。
  • 但是你在哪里设置myText 成员变量?在您的示例代码中,您正在设置一个本地。你能告诉我们更多代码吗?
  • 我将用更多代码编辑问题,对不起:P

标签: android android-view


【解决方案1】:

如果你想要一个永久的参考,你可能会想一些不正确的事情。当手机旋转时,视图会从内存中删除(假设您允许旋转。)

在旋转点,您需要获得指向新创建对象的指针。

要检测与布局相关的方向变化,请使用 onConfigurationChanged,如本文所示。

How to detect orientation change in layout in Android?

【讨论】:

    【解决方案2】:

    您是否在您的onPause() 中注销您的传感器侦听器?我认为您必须在破坏视图和调用 onCreate() 之间获取传感器事件。 (您可以尝试设置一些断点来查看是否发生这种情况。)

    请查看the code on this page,了解应该如何完成。

    否则,该代码应该可以工作。 (我在我的代码中这样做了,这很好——在创建新视图后应该重新分配您的成员。)

    您不必担心 onConfigurationChanged(),Android 文档鼓励您不要搞砸这个。

    【讨论】:

    • 是的,sensorListener 管理我认为我做得对,使用 onPause 和 onResume 方法,问题只是对 View 的引用,但我用 onConfigurationChanged 解决了它。你觉得应该怎么做?我想学习如何正确地做到这一点,现在它有效,但如果你认为它应该以其他方式完成,请告诉我:)
    • 当您自己处理此事件时,您将完全阻止视图重新创建。你隐藏了一个错误,而不是修复它。当您的应用因其他原因(例如内存不足的任务切换)重新启动时,仍可能发生此故障。文档说自己处理 onConfigurationChanged() "should be considered a last resort".
    【解决方案3】:

    只需使用在 onCreate() 中初始化的实例变量。如果你懒得执行 findViewById(),你可以使用我的小注入器库:

    https://github.com/ko5tik/andject

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 2021-05-02
      • 2014-06-28
      • 2010-11-03
      • 1970-01-01
      • 2014-01-23
      相关资源
      最近更新 更多