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であることがわかりました。なぜこのヌルなのか私にはわかりません。

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レイアウトにはありません。したがって、frameLayoutnullになります。これにより、ボタンをクリックしたときにnullPointerExceptionが発生していました。

解決策は、.setVisibility()するビューを検索するときに、ビューの代わりにgetActivity()を使用することです。

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



これが失われた魂を助けることを願っています...私がそうであったように。

于 2013-03-21T12:42:45.293 に答える