- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现的问题是两种相似的情况都可以描述为:-
在带有 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);
(显然,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 的容器。 LinearLayout
和 RelativeLayout
是 ViewGroup 的几个例子。
所以如果你有以下布局:
<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);
但是如果你有嵌套布局,例如
<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/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!