我已经提出了一个包含此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 。为什么这是空的我不知道。
答案 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);
希望这有助于失去灵魂......就像我一样。