Запуск метода Fragment из MainActivity вызывает исключение - PullRequest
0 голосов
/ 14 марта 2019

Я работаю над приложением, которое содержит 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:

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

        }

    }
}

1 Ответ

1 голос
/ 14 марта 2019

В следующем методе из 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()

См. Документацию для получения дополнительной информации о Fragment жизненном цикле

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...