当我在另一个布局中时,可以更改布局可见性

  • 本文关键字:布局 可见性 另一个 android
  • 更新时间 :
  • 英文 :


在这里我创建了四个xml文件main.xmltest1.xmltest2.xmltest3.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
    }

注意这样做会将layoutinflate中的View设置为默认值,并且onCreate()中膨胀的原始layout中的View将不存在。我不确定这是否是你想要的。如果没有,请告诉我。

编辑

现在我知道这些layouts是你的主layout中的include,你不想使用

    findViewById(R.layout.test3)

当您使用<include>标签将它们插入主layout时,给它们一个id,并在中使用该id

     findViewById(R.id.test3)

最新更新