繁体   English   中英

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

[英]Starting Fragment method from MainActivity causes Exception

我在一个包含FragmentsViewPager的应用程序上工作。 我在MainActivity获取位置数据,并希望在片段中使用它,因此我创建了一种方法来传递变量并对其进行处理。 不幸的是,在调用该方法时,我在所有视图对象上都获得了NullPointerException ,例如Fragment内的progressBarCollapsingToolbarLayout 我想片段不是仅通过调用方法而正确启动的,但是如何更改它,因此创建了视图对象? 还是有另一种方法来首先获取位置数据,然后在片段内部使用它?

我的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

public class FragmentB extends Fragment {

    private ProgressBar progressBar;
    private double lat;
    private double lon;

    String title;
    private BaseAdapter mItemsAdapter;

    private final List<HashMap<String, String>> mItemList = new ArrayList<>();

    ArrayList<HashMap<String, String>> resultList = new ArrayList<>();


    public FragmentB() {

    }


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


        progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
        progressBar.setVisibility(View.VISIBLE);

        ((ListView) view.findViewById(R.id.list))
                .setAdapter(mItemsAdapter);


        return view;
    }


    public void start(double latGet, double lonGet){
        lat = latGet;
        lon = lonGet;

        new GetContacts().execute();
    }



    private class GetContacts extends AsyncTask<Void, Void, Void>{

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Showing progress dialog
        }

        @Override
        protected Void doInBackground(Void... arg0) {

        //Fetch And Process Data -> Result into resultList

        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog

            final CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) getActivity().findViewById(R.id.toolbar_layout);
            AppBarLayout appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.appBar);

            progressBar.setVisibility(View.GONE);


            //Updating parsed JSON data into ListView
            mItemsAdapter = new SimpleAdapter(
                    getActivity(), mItemList,
                    R.layout.list_item, new String[]{"brand", "price",
                    "dist", "street", "houseNumber", "postcode", "place"}, new int[]{R.id.brand,
                    R.id.price, R.id.dist, R.id.street, R.id.houseNumber, R.id.postCode, R.id.place});

            mItemList.addAll(resultList);
            mItemsAdapter.notifyDataSetChanged();

        }

    }
}

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的原因。

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

有关Fragment生命周期的更多信息,请参阅文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM