我有两种不同的布局用于两种不同的活动。每个布局中都有一个具有相同ID的按钮:“@ + id / btnOK”。当我以编程方式为其中一个按钮设置属性时,我得到一个NullPointerException
。但是当我更改其中一个ID时,一切都还可以。
我们不能在android中的不同布局中拥有重复的ID吗?
答案 0 :(得分:23)
在“布局中的重复ID”主题中,从android developers
中提取在创建RelativeLayout时,定义视图对象的ID非常重要。在相对布局中,兄弟视图可以相对于另一个兄弟视图定义其布局,该视图由唯一ID引用。
一个ID在整个树中不一定是唯一的,但它在您正在搜索的树的一部分中应该是唯一的 (通常可能是整个树,所以最好尽可能完全独特。
这意味着不同的布局可能会声明相同的ID,因为这不是最佳做法。
答案 1 :(得分:2)
我想在R.java
类中会出现问题,因为此类将包含与每个View
id对应的公共静态成员。
要使它工作,R.java
类需要重命名其中一些id,然后你会如何找到它们?
答案 2 :(得分:2)
您可以使用相同的ID,但它应该采用不同的布局。相同的布局无法处理重复的ID。我已经采用了两个布局,因为你包含的按钮有“btn”。我在具有main.xml的Activity1中调用具有newxml.xml的Activity2。
这是我的代码:
main.xml中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Next" />
</LinearLayout>
活性1 :
setContentView(R.layout.main);
Button button=(Button) findViewById(R.id.btn);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(Activity1.this,Activity2.class);
startActivity(intent);
}
});
newxml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Previous"/>
</LinearLayout>
活性2 :
setContentView(R.layout.newxml);
Button button=(Button) findViewById(R.id.btn);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
答案 3 :(得分:0)
我解决了这个问题,但我找不到原因。 在我的清单文件中,其中一个活动有“android:label =”@ string / app_name“。我删除了它并将其设置为我的主要活动。
上一个清单:
<activity android:name=".ui.ActLogin">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.ActTest" android:label="@string/app_name">
</activity>
新清单:
<activity android:label="@string/app_name" android:name=".ui.ActLogin">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.ActTest">
</activity>
有人知道原因吗?
答案 4 :(得分:0)
在我看来,只要您正确地执行了操作,就可以使用重复的ID(有时很自然):代替Activity.findViewById()
总是返回第一个匹配的视图,请使用ViewGroup.findViewById()
( ViewGroup
可以是LinearLayout
,FrameLayout
等),它随视图组一起返回视图。
为避免棉绒警告:
(首选)将ViewGroup的内容放在单独的布局XML中并使用
<include layout="@layout/myLayout" android:id="@+id/specificId" />
这样,您可以拥有多个布局相同且包含不同父ID(但子ID相同)的包含项,并且皮棉永远不会抱怨。
通过取消选中*Settings/Editor/Inspections*