从MainActivity启动Fragment方法会导致异常

时间:2019-03-14 17:28:00

标签: java android android-fragments

我正在开发一个包含apacheTup = re.match('([(\d\.)]+) (.*) (.*) \[(.*?)\] "(.*?)" (\d+) (.*?) "(.*?)" "(.*?)"',fileStr).groups() Fragments的应用程序。我在ViewPager中获取位置数据,并希望在片段中使用它,因此我创建了一种方法来传递变量并对其进行处理。不幸的是,调用该方法时,我在所有视图对象上都得到了MainActivity,例如NullPointerException内部的progressBarCollapsingToolbarLayout。我想片段不是仅通过调用方法而正确启动的,但是如何更改它,因此创建了视图对象?还是有其他方法可以先获取位置数据,然后再在片段中使用它?

我的Fragment

MainActivity

我的public class MainActivity extends AppCompatActivity implements Serializable { private ViewPager viewPager; BottomNavigationView bottomNavigationView; FragmentA FragmentA; FragmentB FragmentB; FragmentC FragmentC; MenuItem prevMenuItem; public double lat; public double lon; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.viewpager); bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation); bottomNavigationView.setOnNavigationItemSelectedListener( new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.navigation_umkreis: viewPager.setCurrentItem(0); break; case R.id.navigation_karte: viewPager.setCurrentItem(1); break; case R.id.navigation_einstellungen: viewPager.setCurrentItem(2); break; } return false; } }); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (prevMenuItem != null) { prevMenuItem.setChecked(false); } else { bottomNavigationView.getMenu().getItem(0).setChecked(false); } Log.d("page", "onPageSelected: "+position); bottomNavigationView.getMenu().getItem(position).setChecked(true); prevMenuItem = bottomNavigationView.getMenu().getItem(position); } @Override public void onPageScrollStateChanged(int state) { } }); setupViewPager(viewPager); } private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); callsFragment = new CallsFragment(); chatFragment = new ChatFragment(); contactsFragment = new ContactsFragment(); adapter.addFragment(callsFragment); adapter.addFragment(chatFragment); adapter.addFragment(contactsFragment); viewPager.setAdapter(adapter); int limit = adapter.getCount(); viewPager.setOffscreenPageLimit(limit); } public void start() { //Location data fetched here FragmentB fb = new FragmentB(); fb.start(lat, lon); } }

FragmentB

1 个答案:

答案 0 :(得分:1)

MainActivity的以下方法中,您尝试将位置数据传递到FragmentB的实例:

public void start() {
    //Location data fetched here

    FragmentB fb = new FragmentB();
    fb.start(lat, lon);
}

最终的崩溃是由于您仅实例化 Fragment,而没有其他原因。仅当onCreateView()已(即将)添加到onAttach()层次结构中时,才会调用FragmentView之类的方法。因此,对于此FragmentB实例,类似getContext()getActivity()的方法将返回null。这就是为什么您获得NullPointerException的原因。

确保仅在已添加到start()层次结构的Fragment上调用View。或修改该方法,以使其以某种适当的结构存储位置数据,该结构可以从例如数据库访问。 onViewCreated()onStart()onResume()

有关更多information on the Fragment lifecycle的信息,请参见文档