我正在开发一个包含apacheTup = re.match('([(\d\.)]+) (.*) (.*) \[(.*?)\] "(.*?)" (\d+) (.*?) "(.*?)" "(.*?)"',fileStr).groups()
和Fragments
的应用程序。我在ViewPager
中获取位置数据,并希望在片段中使用它,因此我创建了一种方法来传递变量并对其进行处理。不幸的是,调用该方法时,我在所有视图对象上都得到了MainActivity
,例如NullPointerException
内部的progressBar
或CollapsingToolbarLayout
。我想片段不是仅通过调用方法而正确启动的,但是如何更改它,因此创建了视图对象?还是有其他方法可以先获取位置数据,然后再在片段中使用它?
我的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
答案 0 :(得分:1)
在MainActivity
的以下方法中,您尝试将位置数据传递到FragmentB
的实例:
public void start() {
//Location data fetched here
FragmentB fb = new FragmentB();
fb.start(lat, lon);
}
最终的崩溃是由于您仅实例化 Fragment
,而没有其他原因。仅当onCreateView()
已(即将)添加到onAttach()
层次结构中时,才会调用Fragment
或View
之类的方法。因此,对于此FragmentB
实例,类似getContext()
或getActivity()
的方法将返回null
。这就是为什么您获得NullPointerException
的原因。
确保仅在已添加到start()
层次结构的Fragment
上调用View
。或修改该方法,以使其以某种适当的结构存储位置数据,该结构可以从例如数据库访问。 onViewCreated()
,onStart()
或onResume()
有关更多information on the Fragment
lifecycle的信息,请参见文档