【问题标题】:Android - set button text from Fragment in ActivityAndroid - 在 Activity 中从 Fragment 设置按钮文本
【发布时间】:2016-11-01 17:02:30
【问题描述】:

我在 Android Studio 2.2.2 中使用 Navigation Drawer Activity 模板创建了新项目。我决定使用 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 类

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

【问题讨论】:

    标签: android android-fragments nullpointerexception android-button


    【解决方案1】:

    在不在活动中的片段内调用 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();
    

    【讨论】:

    • 你应该清楚地定义在你的问题中显示什么以及何时显示文本。我假设您想根据单击的导航项更改文本。我相应地编辑了我的答案。
    • 并且标题说“在活动中从片段设置按钮文本”。但是您在代码中所做的是在 Activity 的 Fragment 中设置文本
    • 抱歉,您更新的代码对我不起作用。我想在Activity中调用一个方法changeBtnText(String txt)。
    • @Hawkridge 你不能。在创建 Fragment 并且布局膨胀之前,该按钮不可用。像这个答案一样使用参数是正确的方法。
    【解决方案2】:

    您还没有创建Fragment,这就是它为空的原因。你创建了一个新的,但不保存它。

    试试这个;

    FragmentOne fragment_obj = new FragmentOne();
    FragmentManager fm = getSupportFragmentManager();
        fm.beginTransaction().replace(R.id.content_frame, fragmentOne).commit();
    
    fragment_obj.changeBtnText("Changed text");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      相关资源
      最近更新 更多