Android - 从活动中的片段设置按钮文本

时间:2016-11-01 17:02:31

标签: android android-fragments nullpointerexception android-button

我在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更改片段的按钮文本

2 个答案:

答案 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");