有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在活动中访问片段的文本视图时发生java NullPointerException

这似乎是一个常见问题,但在尝试了几个小时作为类似问题的答案提供的随机解决方案后,当我从活动访问片段的textView时,我的代码仍然会产生NullPointerException

当片段的textView有预定义的文本时,我可以包含(并查看)我的片段,或者在片段类的onCreateView()中使用setText(),但不能使用setter方法(这里是set_message_success()

这是我的片段类Fragment_Message

public class Fragment_Message extends Fragment {

    TextView textview_message;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_messagebox, container, false);
        textview_message = (TextView) view.findViewById(R.id.fragment_textview_message);
        textview_message.setText("test");
        return view;
    }

    public void set_message_success(String text) {
        textview_message.setText(text);
    }
}

以及活动课程中的相关行:

FragmentManager frag_manager    = getFragmentManager();
FragmentTransaction transaction = frag_manager.beginTransaction();
Fragment_Message fragment       = new Fragment_Message();
fragment.set_message_success(message_green);
transaction.add(R.id.home_fragment_container, fragment, "Fragment");
transaction.commit();

home_fragment_container是我主要活动中的一个相对人。xml,fragment_textview_message是fragment_messagebox中的文本视图。xml,只是想让你知道,这些是什么

NullPointerException是在^{中引起的。有什么想法吗


共 (2) 个答案

  1. # 1 楼答案

    您正在创建一个片段,但未执行创建周期。 这一行:

    Fragment_Message fragment = new Fragment_Message();
    

    不会自动调用onCreateView,因此您的文本视图未初始化(即null),当您尝试使用以下行设置其文本时:

    fragment.set_message_success(message_green);
    

    由于文本视图成员未初始化,因此会出现异常,因此可以在构造函数中初始化文本视图,或者在所需布局中定义片段

    有关详细信息,请查看here

  2. # 2 楼答案

    问题显然是碎片的生命周期。当我添加一个片段(在活动的onCreate()中完成)并在片段的onCreateView()中定义它的文本视图文本时,片段将毫无问题地显示出来。但是在活动的onCreate()中访问片段的文本视图失败,因为——我猜——片段还没有连接

    因此,我在活动的onCreate()中添加了片段,并在活动的onResume()中更改了片段的文本视图文本,按照我的理解,应该将片段附加到其中。此外,使用executePendingTransactions()也有帮助。我现在的工作代码:

    回家。爪哇

    FragmentManager     frag_manager;
    FragmentTransaction transaction;
    Fragment_Message    fragment;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
    
        frag_manager    = getFragmentManager();
        transaction     = frag_manager.beginTransaction();
        fragment        = new Fragment_Message();
    
        transaction.add(R.id.home_fragment_container, fragment, "Fragment_Messagebox");
        transaction.commit();
    }
    
    
    @Override
    protected void onResume() {
            frag_manager.executePendingTransactions();          
            fragment.set_message_success("a message");
    }
    

    片段信息。爪哇

    public class Fragment_Message extends Fragment {
    
        TextView textview_message;
        View view;
    
        public Fragment_Message() {}
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            view = inflater.inflate(R.layout.fragment_messagebox, container, false);
            return view;
        }
    
    
        public void set_message_success(String text) {
            textview_message = (TextView) view.findViewById(R.id.fragment_textview_message);
            textview_message.setText(text);
        }
    }