在 Activity 中调用 Fragment 方法会导致空指针异常

Posted

技术标签:

【中文标题】在 Activity 中调用 Fragment 方法会导致空指针异常【英文标题】:Calling a Fragment Method in an Activity causes a Null Pointer Exception 【发布时间】:2017-07-24 19:27:13 【问题描述】:

我想在单击 FloatingActionButton 时调用 Fragment 方法。 我正在使用黄油刀。

错误:

PID:9956 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void com.fischerdaniel.testapp.FirstFragment.setTvText()”

MainActicity 部分:

  @OnClick(R.id.fab_one, R.id.fab_two, R.id.fab_three) public void test(View view) 
        switch (view.getId()) 
            case R.id.fab_three:
                FirstFragment firstFragment = (FirstFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_first);
                firstFragment.setTvText();
                break;
            default:
                break;
        
    

片段部分:

    @BindView(R.id.et_one) EditText etOne;
    @BindView(R.id.et_two) EditText etTwo;
    @BindView(R.id.tv_one) TextView tvOne;
    @BindView(R.id.tv_two) TextView tvTwo;

    private Unbinder unbinder;

   @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        View view = inflater.inflate(R.layout.fragment_first, container, false);
        unbinder = ButterKnife.bind(this, view);

        return view;
    

    protected void setTvText() 
        tvOne.setText(etOne.getText());
        tvTwo.setText(etTwo.getText());
    

【问题讨论】:

你是通过引用来称呼它 【参考方案1】:

查看此链接:findFragmentById always returns null

创建片段时,请使用:

add(int id, Fragment fragment, String tag) 

然后要获取您的片段,请使用:

findFragmentByTag(String tag)

【讨论】:

片段在浏览器中【参考方案2】:
public void onMenuItemClick(View clickedView, int position) 
    switch (position)
        case 1:
             fragmentChanger("Notifications",new notifyFragment());
           break;
        case 2:
             fragmentChanger("QR Code",new qrFragment());
            break;
        case 3:
            fragmentChanger("User ID",new MainFragment());
            break;
        case 4:
            fragmentChanger("Settings",new settingsFragment());
            break;
        default:
            Toast.makeText(this, "Clicked on position: " + position, Toast.LENGTH_SHORT).show();
            break;
    


//function that does the trasaction when a fragment object is passed
//R.id.container is my default frame
public void fragmentChanger(String title, Object expectedFragment)
   // mToolBarTextView.setText(title);
    transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.container, (Fragment) expectedFragment);
    transaction.addToBackStack(null);
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    transaction.commit();

【讨论】:

看起来很详细,但可以使用一些解释性文字。见How do I write a good answer?。 片段在浏览器中【参考方案3】:

从 Activity 调用您的片段方法,如下所示,

对我有用

FirstFragment firstFragment =(FirstFragment)getSupportFragmentManager().getFragments().get(0); 

firstFragment.yourmethod();

这里 0 是您的片段位置。

【讨论】:

以上是关于在 Activity 中调用 Fragment 方法会导致空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

无法在父 Activity 中调用 Fragment 方法

在 Activity 中调用 Fragment 方法会导致空指针异常

如何处理 Activity 和 Fragment 之外的权限请求?

zxing onActivityResult 不在 Fragment 中仅在 Activity 中调用

在父Activity onBackPressed方法中调用Fragment接口方法

如何在 JetPack Navigation 组件中托管 Fragment 的 Activity 中调用导航 Fragments 函数?