Android:findViewById 给了我错误的指针?

Posted

技术标签:

【中文标题】Android:findViewById 给了我错误的指针?【英文标题】:Android: findViewById gives me wrong pointer? 【发布时间】:2012-04-14 07:46:42 【问题描述】:

在我的 updateGUI() 函数中,我像这样更新每个 TextView:

((TextView) findViewById(R.id.lbTrackerLat)).setText(String.valueOf(lat));
((TextView) findViewById(R.id.lbTrackerLong)).setText(String.valueOf(lng));
((TextView) findViewById(R.id.lbTrackerAlt)).setText(String.valueOf(alt));

当我通过在 onCreate 中分配 onclick 按下按钮调用 updateGUI() 时,更新总是有效的。

我有一个 locationListener,它在用户单击另一个按钮时启动,并且在每个更新事件中我也会在那里调用 updateGUI(),它在屏幕第一次旋转之前一直有效,之后由于某种原因屏幕不会刷新。

在试图找出原因时,我已将此代码添加到 updateGUI() 函数中:

TextView t = (TextView) findViewById(R.id.lbTrackerPostLastRefresh);
t.setText(formattedDate);
Log.d("H","EXIT  lbTrackerPostLastRefresh="+t.toString());

旋转后(再次调用 onCreate),当从按钮单击调用它时,我得到 44c76a78 作为指针。 locationListener更新函数调用findVIewByID时,返回指针44c1b518!!??

我知道布局被销毁并重新创建,但是为什么 findViewById 返回旧的指针值??

吐痰: 就好像从初始 onCreate 开始的第一个视图实例(连同它的资源)在设备旋转时实例化了一个新视图之后继续愉快地继续。也许 LocationListener 这样做是因为我没有停止它。但是每次旋转设备时停止和启动它似乎很愚蠢!

【问题讨论】:

你不能使用 t.getText();,尝试清理项目并重新运行? 为什么 id 更改对您很重要? findViewById() 是否返回不同的控件? @hotveryspicy 我正在尝试写入 TextView 的标签。 @rekire ID 保持不变。指向 TextView 控件的指针发生了变化。 为了初始化你的 locationManager,你是使用你的 Activity 上下文还是你的 Application 上下文?尝试并始终使用您的应用程序上下文。试试这个改变,告诉我它是否有效。如果是,那我会提供解释。 【参考方案1】:

我猜测 locationListener 是 Activity 的匿名内部类,这意味着它持有对其父类的引用。因此,现在如果在 onCreate() 调用之后重新创建此 locationListener,它将引用旧 Activity,并且对 findViewById() 的调用将返回该旧 Activity 持有的对象。这不仅会导致您的程序执行不正确,还会导致内存泄漏(基本上原始 Activity 创建的所有内容都会被保留)。

如果不是上述原因,那么我需要有关 locationListener 及其使用方式的更多信息,以便提供帮助。

【讨论】:

谢谢凯 - 有同样的想法,但不知道如何解决它。很好的洞察力。检查出来... 我想我无法找到正确的方法。活动的来源在这里:www.cde.co.za/shared/DroneMateActivity.txt 这很简单。你会看到我已经在类中声明了 locationManager 和 locationListener,但是我使用匿名内部类来实例化它们。不知道在这里做什么是正确的。 我不知道该怎么办,有点茫然。 真的需要在onConfigurationChanged中设置ContentView吗?尝试删除它,看看它是否有帮助。

以上是关于Android:findViewById 给了我错误的指针?的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio Release build 给了我:不幸的是,“App Name”已经停止

试图在我的 Android 应用程序中 setDisplayHomeAsUpEnabled(true) 并且它给了我一个 NullPointerException

android 当我转到 API>19 时,我的 Java 接口给了我“TypeError: Android.mthod is not a function

findViewById 返回 null (TextView) [重复]

jsonArray.toString() 给了我不完整的 json

为啥我的 sqlite 数据库中的 rawquery 给了我错误的人?