我在Android Studio 2.2.2中使用导航抽屉活动模板创建了新项目。我决定使用 FrameLayout ,所以当我点击导航菜单项时,会加载新的片段。
在我的 content_main.xml 中,我有这样的FrameLayout元素:
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
这是显示内容的框架。
然后我有布局 fragment_one.xml 及其类 FragmentOne ,它们看起来像这样:
fragment_one.xml
<Button
android:text="Default Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/mybutton" />
FragmentOne class
public class FragmentOne extends Fragment {
Button btn;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
btn = (Button) view.findViewById(R.id.mybutton);
return view;
}
public void changeBtnText(String txt)
{
btn.setText(txt);
}
}
在 MainActivity 的onCreate()方法中,我有代码:
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.content_frame, new FragmentOne()).commit();
FragmentOne fragment_obj = (FragmentOne)getSupportFragmentManager().
findFragmentById(R.id.frOne);
fragment_obj.changeBtnText("Changed text");
我得到错误:
尝试在空对象引用上调用虚方法'void com.example.user.myapplication.FragmentOne.changeBtnText(java.lang.String)'
如何使用changeBtnText(String txt)方法从Main Activity更改片段的按钮文本?
答案 0 :(得分:0)
调用不在活动中的片段内的changeBtnText(String txt)。
修改强>
FragmentOne.class里面的
public FragmentOne newInstance(String text) {
FragmentOne fragmentOne = new FragmentOne ();
Bundle args = new Bundle();
args.putInt("text", text);
fragmentOne .setArguments(args);
return fragmentOne ;
}
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
btn = (Button) view.findViewById(R.id.mybutton);
String text = getArguments().getString("text", null);
changeBtnText(text);
return view;
}
活动中的
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.content_frame, FragmentOne.newInstance("text")).commit();
答案 1 :(得分:0)
您尚未创建Fragment
,这就是为什么它为空。你在线创建一个新的,但不保存它。
试试这个;
FragmentOne fragment_obj = new FragmentOne();
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.content_frame, fragmentOne).commit();
fragment_obj.changeBtnText("Changed text");