在片段内访问 TextView 会产生 NullPointerException

Posted

技术标签:

【中文标题】在片段内访问 TextView 会产生 NullPointerException【英文标题】:Accessing TextView inside a fragment is giving NullPointerException 【发布时间】:2020-06-19 13:49:55 【问题描述】:

片段定义如下。我正在尝试设置 positionTextView 的文本。

public class Fragment2 extends Fragment 
    private TextView positionTextView,fragment2TextView;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
        View view =  inflater.inflate(R.layout.layout_fragment2, container, false);
        positionTextView = view.findViewById(R.id.positionTextView);
        fragment2TextView = view.findViewById(R.id.fragment2TextView);

        Toast.makeText(getContext(),"OnCreateView",Toast.LENGTH_LONG).show();
        return  view;

    

    public void setContentOfTextView( int position) 
        positionTextView.setText(Integer.toString(position));
    

MainActivity 中,我添加Fragment2 如下。

@Override
public void fragmentRespond(int index) 
    FragmentTransaction transaction =  fragmentManager.beginTransaction();
    Fragment2 fragment2 = new Fragment2();
    transaction.add(R.id.group2,fragment2,"fragment2");
    transaction.commit();
    transaction.addToBackStack("fragment2");
    fragment2.setContentOfTextView(index);

我在另一个包含ListView 的片段中有fragmentRespond 函数。 ListViewonItemClickListener 调用这个函数,即fragmentRespond(int index)

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) 
    super.onActivityCreated(savedInstanceState);

    String[] quotes = getResources().getStringArray(R.array.quotes);
    CustomArrayAdapter customArrayAdapter = new CustomArrayAdapter(getContext(),quotes,null);
    listView.setAdapter(customArrayAdapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
            fragmentCommunicator.fragmentRespond(position);
        
    );

我收到以下错误

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)”

非常感谢有关此问题或改进编码风格的任何建议。

提前谢谢你。

【问题讨论】:

【参考方案1】:

您正在获得 NPE,因为当您尝试使用活动中的 setContentOfTextView 函数设置文本时,尚未加载 Fragment 的视图。

片段中的视图需要先膨胀,以便在其中加载一些东西。因此,您应该在片段的 onCreateView 函数中执行此操作。

关于从您的活动中传递信息 - 您可以在从您的活动中启动它时使用传递给您的片段的Bundle 轻松做到这一点。

您可以这样做。

在您的活动中,在启动片段时使用Bundle 传递数据。

@Override
public void fragmentRespond(int index) 

    // Prepare the bundle
    Bundle bundle = new Bundle();
    bundle.putInt("index", index);

    FragmentTransaction transaction =  fragmentManager.beginTransaction();
    Fragment2 fragment2 = new Fragment2();
    fragment2.setArguments(bundle); // Set the arguments here to be passed on to your fragment while loading.

    transaction.add(R.id.group2,fragment2, "fragment2");
    transaction.commit();
    transaction.addToBackStack("fragment2");

然后在您的片段中,从 Bundle 获取所需的数据并将其加载到您的 TextView 中。

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
    View view =  inflater.inflate(R.layout.layout_fragment2, container, false);
    positionTextView = view.findViewById(R.id.positionTextView);
    fragment2TextView = view.findViewById(R.id.fragment2TextView);

    // Load the information in your TextView here
    Bundle args = getArguments();
    if (args != null && args.containsKey("index")) 
        setContentOfTextView(args.getInt("index"));
    

    Toast.makeText(getContext(),"OnCreateView",Toast.LENGTH_LONG).show();
    return  view;

希望对你有帮助。

【讨论】:

非常感谢您的回复。我会试一试的。 只是评论,但答案很好! 谢谢! @GauravMall 是的,它成功克服了NPE。 非常感谢@ReazMurshed。

以上是关于在片段内访问 TextView 会产生 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

从片段更新ListView适配器内的TextView

片段内的视图坐标始终为空

片段中的TextView在Android Studio中返回Null

使用 Kotlin Coroutines 更新我的 TextView 会导致它崩溃:

使用在另一个片段(NPE)中生成的值设置片段的 TextView [重复]

片段 TextView 无法从 parcelable 对象更新