以编程方式更改视图的可见性属性

时间:2013-03-20 12:46:06

标签: android-fragments visibility

我已经提出了一个包含此problem的更长问题。试图将更大的问题细分为较小的问题。

我正在尝试以编程方式更改android:visibility =“gone”:

XML: 这是MainAction.java的布局,有3个Fragments容器。当用户使用.replace(R.id.fragment_C,new FragmentC())点击按钮时,不应出现fragment_C并填充它。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:paddingLeft="0dp"
    android:paddingRight="0dp" >

    <LinearLayout
        android:id="@+id/fragments_container"
        android:layout_width="fill_parent"
        android:layout_height="200dp"
        android:baselineAligned="false" >

        <FrameLayout
            android:id="@+id/fragment_A"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="0.5"
            android:background="#CCCCCC" >
        </FrameLayout>

        <FrameLayout
            android:id="@id/fragment_B"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="0.5"
            android:background="#B4B4B4"
             >
        </FrameLayout>
    </LinearLayout>

    <FrameLayout
        android:id="@+id/fragment_C"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@id/fragment_container"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="0dp"
        android:background="#A3A3A3"
        android:visibility="gone" >
    </FrameLayout>

</RelativeLayout>

应该添加FragmentC并更改可见性属性的按钮的代码:

public class FragmentB extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragmentB, container, false);

        ListView listView = (ListView) view.findViewById(R.id.listView1);
        Button button = (Button) view.findViewById(R.id.button);

        String[] machines = new String[] { "MachineId-001", "MachineId-002", "MachineId-003", "MachineId-004", "MachineId-005", "MachineId-006", "MachineId-007", "MachineId-008"};

        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listView.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.select_dialog_multichoice, machines));
        final FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.fragment_C);

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
               Activity activity = getActivity();

               if (activity != null) {
                   getFragmentManager().beginTransaction().replace(R.id.fragment_C, new FragmentC()).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).addToBackStack(null).commit();
                // When using setVisibility the app crashes with a  
                // java.lang.NullPointerException 
                   frameLayout.setVisibility(View.VISIBLE);
                }
            }

        });

        return view;
    }
}

任何人都可以告诉我为什么我会得到一个NullPointerException以及这个世界中我在代码中做错了什么?



其他数据:

调试应用程序后,我发现我的 frameLayout 变量是 null 。为什么这是空的我不知道。

1 个答案:

答案 0 :(得分:2)

找到问题!..和解决方案

错误是在搜索我想要设置我正在使用的可见性属性的View时:

final FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.fragment_C);

如果查看代码,请查看:

View view = inflater.inflate(R.layout.fragmentB, container, false);

当然 fragment_C 不在我的 fragment_B 布局中。所以 frameLayout 将是 null 。单击按钮时,这会导致nullPointerException。

解决方案是在搜索您想要的视图时使用getActivity()而不是view .setVisibility()。

final FrameLayout frameLayout = (FrameLayout) getActivity().findViewById(R.id.fragment_C);



希望这有助于失去灵魂......就像我一样。