尝试在空对象引用上调用虚方法 - Fragment Android

时间:2018-01-03 23:49:47

标签: java android android-fragments

我正在尝试编写将数据从片段发送到Android Studio中的另一个片段的方法。我已经有了创建此方法的示例应用程序。它工作正常。

我只是复制每个方法和界面与示例应用程序完全相同,并创建一个新的片段类(也与示例中的相同)。

The MainActivity looks like this 
public class MainActivity extends AppCompatActivity implements FragmentOne.SendMessage, FragmentOne.SendMessageLanLon {

    TabLayout tabLayout;
    ViewPager viewPager;
    ViewPagerAdapter viewPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        viewPager = (ViewPager) findViewById(R.id.viewPager);
        viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(viewPagerAdapter);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }

    @Override
    public void sendData(String message) {
        String tag = "android:switcher:" + R.id.viewPager + ":" + 1;
        FragmentTwo f = (FragmentTwo) getSupportFragmentManager().findFragmentByTag(tag);
        f.displayReceivedData(message);
    }

    @Override
    public void sendDataLatLon(String message) {
        String tag = "android:switcher:" + R.id.viewPager + ":" + 2;
        FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);
        f.displayReceivedDataLanLon(message);
    }
}

sendData工作正常但sendDataLatLon崩溃了 - 我收到了消息

  java.lang.NullPointerException: Attempt to invoke virtual method 'void com.journaldev.passingdatabetweenfragments.FragmentThree.displayReceivedDataLanLon(java.lang.String)' on a null object reference
                                                     at com.journaldev.passingdatabetweenfragments.MainActivity.sendDataLatLon(MainActivity.java:38)
                                                     at com.journaldev.passingdatabetweenfragments.FragmentOne$1.onClick(FragmentOne.java:87)

现在在FragmentOne中 - 我使用按钮 - 一切正常

 bttnPass.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    SM.sendData(inDataLat.toString().trim() + ";" + inDataLon.toString().trim());
                }

            });

在同一个片段中,当我使用另一个按钮(与上面相同)时,您可以在上面的logcat中看到行SLL.sendData中的错误。

这是我写的其余代码

interface SendMessage {
        void sendData(String message);

    }

    interface SendMessageLanLon {
        void sendDataLatLon(String message);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        try {
            SM = (SendMessage) getActivity();
            SLL = (SendMessageLanLon) getActivity();
        } catch (ClassCastException e) {
            throw new ClassCastException("Error in retrieving data. Please try again");
        }
    }

现在,参考日志,我不知道对象为何为空。我发送的消息不为空,方法是SAME作为工作方式。

我的方法中的标记值是否有问题? 这是ViewPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter {

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        if (position == 0) {
            fragment = new FragmentOne();
        } else if (position == 1) {
            fragment = new FragmentTwo();
        } else if (position == 2) {
            fragment = new FragmentThree();
        }
        return fragment;
    }

或许我可以使用相同的方法将值传递给另一个片段,但我不知道如何。我刚开始学习android。试图了解它是如何工作的:/

2 个答案:

答案 0 :(得分:0)

FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);

这将返回Null,因为活动中FragmentThree不是inflating。当我们使用ViewPager时,只有前一个和下一个Fragment会膨胀而不是全部{{} 1}}。

答案 1 :(得分:0)

使用此代码解决此问题

在活动中     @覆盖     public void sendDataLatLon(String message){         String tag =“android:switcher:”+ R.id.viewPager +“:”+ 2;         viewPagerAdapter.sendData(消息);     }

在ViewPagerAdapter类中     String message =“”;

public ViewPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    Fragment fragment = null;
    if (position == 0) {
        fragment = new FragmentOne();
    } else if (position == 1) {
        fragment = new FragmentTwo();
    } else if (position == 2) {
        fragment = new FragmentThree(message);
    }
    return fragment;
}

@Override
public int getCount() {
    return 3;
}

public void sendData(String message) {
    this.message = message;
}

在FragmentThree片段中     String message1 =“”;

public FragmentThree(String message1) {
    this.message1 = message1;
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.fragment_fragment_three, container, false);
    return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    fragThreeTv = (TextView) view.findViewById(R.id.fragThreeTv);
    fragThreeTv.setText(message1);

}