在活动中调用片段方法会导致空指针异常

时间:2017-03-04 18:55:17

标签: android xml android-activity fragment butterknife

当我点击FloatingActionButton时,我想调用Fragment方法 我正在使用Butterknife。

错误:

  

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());
    }

3 个答案:

答案 0 :(得分:1)

请参阅此链接:findFragmentById always returns null

创建片段时,请使用:

add(int id, Fragment fragment, String tag) 

然后获取你的片段,使用:

findFragmentByTag(String tag)

答案 1 :(得分:0)

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();
}

答案 2 :(得分:0)

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

对我有用

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

firstFragment.yourmethod();

这里0是您的片段位置。