gpt4 book ai didi

java - 为什么我在一种情况下会出现空指针异常,而在类似情况下却不会?

转载 作者:行者123 更新时间:2023-11-30 01:31:01 28 4
gpt4 key购买 nike

我发现的问题是两种相似的情况都可以描述为:-

在带有 ListView 的 Activity 中,我单击一个项目,该项目启动另一个 Activity 以编辑该项目。在辅助 Activity 中,编辑项目并将更改保存到数据库后,我需要通过交换光标来刷新 ListView。

其中一个我使用了以下内容(这在没有空指针的情况下有效):-

    Cursor csr = shopperdb.getProductsperAisle(aisleid);
View v = findViewById(R.id.aapts_layout);
ListView lv = (ListView) v.findViewById(R.id.aaptslv100);
ProductsPerAisleCursorAdapter adapter = (ProductsPerAisleCursorAdapter) lv.getAdapter();
adapter.swapCursor(csr);
finish();
  • 以上代码位于名为 ProductUsageEdit 的 Activity 中,该 Activity 使用 activity_productusage_edit.xml 并将其设置为 ContentView。

  • ListView aaptslv100 是在 aapts_layout 中定义的 activity_shop_add.xml Activity AddProductToShopActivity 将 aapts_layout 设置为内容 View 。当单击 ListView aaptslv100 中的项目时,此 Activity 将启动 ProductUsageEdit Activity 。

  • R.id.aapts_layout 是主要布局的 ID,R.id.aaptslv100 是该布局中 ListView 的 ID。此代码通过按钮的 OnClickListener 调用。

另一种情况,如果使用等效的即从布局 ID 获取初始 Activity 的 View ,然后通过该 V 获取 ListView 的 ID;发出空指针异常(仍然导致 ListView 被刷新)即使用:-

    View v = findViewById(R.id.aslbc_layout);
ListView callerListView = (ListView) v.findViewById(R.id.aslbclv01);
....

而不是在第二个 sceanrio 中,为了不获取空指针异常,我编写了代码:-

    Cursor csr = shopperdb.getShopsAsCursor();
ListView callerListView = (ListView) findViewById(R.id.aslbclv01);
ShopsCursorAdapter calleradapter = (ShopsCursorAdapter)callerListView.getAdapter();
calleradapter.changeCursor(csr);
  • 上面的代码在 ShopAddActivity 中,使用来自 Activity ShopListByCursorActivity 的 ListView aslbclv01 在来自 的布局 aslbc_layout>activity_shop_list_by_cursor.xml

(显然,Listview 与所使用的适配器和获得的游标不同,ps finish() 的编码稍晚一点,位于此代码所在的 If 子句之外)。

如果我尝试在第一种情况下使用与此等效的方法,则会出现空指针异常(然后 ListView 再次刷新)。

我想要的是一种适用于这两种情况和其他类似情况的标准方法。对于为什么我似乎需要对基本相同的场景使用不同的方法,我也非常感谢一些理解。


(已添加)

仔细想想,这两种场景是有区别的;

第一个 sceanrio 称为辅助 Activity ,其布局更为复杂。因为它是一个带有嵌套 LinearLayouts 的 LinearLayout,然后是 Text/EditViews。

第二种情况使用 RelativeLayout,所有 View 都位于该 RelativeLayout 下。

这可能是需要获取原始布局 ID 吗?

但是,如果是这样的话,我仍然会思考为什么 View v = findViewById(<orginatingLayout>)在不太复杂的第二种情况下将 v 设置为 null。也许 findByView 对 View 类型敏感?

最佳答案

要通过 id 成功找到 View 实例,首先您必须确保为 Activity/Fragment 实例设置了正确的布局。 findViewById() of Activity,AFAIK,找到与给定 id 具有相同 id 的顶级父节点的 subview 。它不会递归地在嵌套的 ViewGroup 中查找 View 。 ViewGroup 是 View 的后代,充当一个或多个 View 的容器。 LinearLayoutRelativeLayout 是 ViewGroup 的几个例子。

所以如果你有以下布局:

res/layout/activity_main.xml

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.juhara.demo.intent1.MainActivity" >

<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_btn1" />
</RelativeLayout>

在 Activity 的 OnCreate() 中,您调用

setContentView(R.layout.activity_main);

然后调用Activity的findViewById()即可成功获取Button实例

Button abutton = (Button) findViewById(R.id.btn_start);

但是如果你有嵌套布局,例如

res/layout/activity_main2.xml

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >

<RelativeLayout
android:id="@+id/button_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_btn1" />
</RelativeLayout>
</RelativeLayout>

然后下面的代码将使 abutton 设置为 null。

setContentView(R.layout.activity_main2);
Button abutton = (Button) findViewById(R.id.btn_start);

要正确获取 Button 实例,您必须先找到 Button 的父节点,然后使用它来查找 View 。

setContentView(R.layout.activity_main2);
View button_container = findViewById(R.id.button_container);
Button abutton = (Button) button_container.findViewById(R.id.btn_start);

关于java - 为什么我在一种情况下会出现空指针异常,而在类似情况下却不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35760424/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com