在这里我创建了四个xml文件main.xml
、test1.xml
、test2.xml
和test3.xml
。
它们在spinner
中被访问,但我收到了一个异常。我也给出logcat。
请帮帮我。
String[] lan = { "test1", "test2", "test3" };
Spinner spn = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, lan);
spn.setAdapter(adapter);
spn.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) {
if (pos == 0) {
findViewById(R.layout.test1).setVisibility(View.VISIBLE);
} else if (pos == 1) {
findViewById(R.layout.test2).setVisibility(View.VISIBLE);
} else if (pos == 2) {
findViewById(R.layout.test3).setVisibility(View.VISIBLE);
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
Logcat:
07-11 18:09:39.480: E/AndroidRuntime(21200): FATAL EXCEPTION: main
07-11 18:09:39.480: E/AndroidRuntime(21200): java.lang.NullPointerException
07-11 18:09:39.480: E/AndroidRuntime(21200): at com.venky.innverlayoutchangevisibility.MainActivity$1.onItemSelected(MainActivity.java:30)
07-11 18:09:39.480: E/AndroidRuntime(21200): at android.widget.AdapterView.fireOnSelected(AdapterView.java:871)
07-11 18:09:39.480: E/AndroidRuntime(21200): at android.widget.AdapterView.access$200(AdapterView.java:42)
07-11 18:09:39.480: E/AndroidRuntime(21200): at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:837)
07-11 18:09:39.480: E/AndroidRuntime(21200): at android.os.Handler.handleCallback(Handler.java:587)
07-11 18:09:39.480: E/AndroidRuntime(21200): at android.os.Handler.dispatchMessage(Handler.java:92)
07-11 18:09:39.480: E/AndroidRuntime(21200): at android.os.Looper.loop(Looper.java:130)
07-11 18:09:39.480: E/AndroidRuntime(21200): at android.app.ActivityThread.main(ActivityThread.java:3691)
07-11 18:09:39.480: E/AndroidRuntime(21200): at java.lang.reflect.Method.invokeNative(Native Method)
07-11 18:09:39.480: E/AndroidRuntime(21200): at java.lang.reflect.Method.invoke(Method.java:507)
07-11 18:09:39.480: E/AndroidRuntime(21200): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
07-11 18:09:39.480: E/AndroidRuntime(21200): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
07-11 18:09:39.480: E/AndroidRuntime(21200): at dalvik.system.NativeStart.main(Native Method)
在此处输入代码您不能使用来自不同布局的组件,如。您需要做的是定义一个LayoutInflator
并以此为基础进行工作。R.id.yourComponent
只能访问onCreate方法中定义的(大部分)组件,如:
setContentView(R.layout.main);
要执行所需操作,请为每个布局创建一个充气器(注意:要实现此操作,请给test1.xml、test2.xml、test3.xml中的每个主LinearLayouts提供一个ID,然后访问该ID,而不是文件本身):
String[] lan = { "test1", "test2", "test3" };
Spinner spn = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, lan);
//Duplicate this code for every .xml layout inside your onItemSelected
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View firstView = inflater.inflate(R.layout.test1, null); //inflates test1.xml
LinearLayout test1Layout = (LinearLayout) firstView.findViewById(R.id.idOfTheLayout); //This finds a component inside your test1.xml file. As mentioned, give the highest Layout which holds all your components an ID.
test1Layout.setVisibility(View.VISIBLE);
spn.setAdapter(adapter);
spn.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View v, int pos,
long id) {
if (pos == 0) {
findViewById(R.layout.test1).setVisibility(View.VISIBLE);
} else if (pos == 1) {
findViewById(R.layout.test2).setVisibility(View.VISIBLE);
} else if (pos == 2) {
findViewById(R.layout.test3).setVisibility(View.VISIBLE);
}
}
我几乎肯定你做不到。根据文件
从onCreate(Bundle)中处理的XML中查找由id属性标识的视图。
这是用来在当前膨胀的layout
中查找View
的,我知道这些是单独的文件。您需要使用inflater
。或者在这种情况下,如果在选择项目后不需要使用任何当前Views
,请致电setContentView()
@Override
public void onItemSelected(AdapterView<?> parent, View v, int pos,
long id) {
int layout; // create int for layout to inflate
if (pos == 0) {
layout = R.layout.test1; // assign int according to the layout needed
} else if (pos == 1) {
layout = R.layout.test2;
} else if (pos == 2) {
layout = R.layout.test3;
}
setContentView(layout); // inflate the layout
}
注意这样做会将layout
和inflate
中的View
设置为默认值,并且onCreate()
中膨胀的原始layout
中的View
将不存在。我不确定这是否是你想要的。如果没有,请告诉我。
编辑
现在我知道这些layouts
是你的主layout
中的include
,你不想使用
findViewById(R.layout.test3)
当您使用<include>
标签将它们插入主layout
时,给它们一个id
,并在中使用该id
findViewById(R.id.test3)