0

我已经问过一个包含这个问题的更长的问题。试图将更大的问题分割成更小的问题。

我正在尝试像这样以编程方式更改 android:visibility = "gone":

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

<?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。为什么这个 null 我不知道。

4

1 回答 1

2

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

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

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。

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

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



希望这可以帮助迷失的灵魂……就像我一样。

于 2013-03-21T12:42:45.293 回答