Фрагмент Android: исключение нулевого указателя при вызове setAdapter () для Snipper - PullRequest
0 голосов
/ 23 октября 2019

Я создаю приложение, используя фрагменты. Есть три фрагмента для моей основной деятельности, надуваемые из меню Bottom Navigation. Я добавил Dropdown snipper в макет фрагмента 1. В основном упражнении я пытаюсь установить адаптер для этого snipper. Код следующий:

//In the main activity onCreate()
    snipper1 = findViewById(R.id.spinner_add);
             categories = new String[]{"Phones", "Laptops", "Tablets"};
            ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, categories);
            snipper1.setAdapter(adapter);

Поскольку я не инициализирую фрагмент1 в действии перед вызовом snipper.setAdapter() , и я не хочу делать это , поэтому я получаю следующееИсключение NullPointer:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter)' on a null object reference

Мой альтернативный вопрос:

"Как мне вызвать findViewById() из действия для элемента, присутствующего в его дочернем элементе фрагмент"?

Спасибо за ваши ответы!

Ответы [ 2 ]

3 голосов
/ 23 октября 2019

попробуйте этот код,

Spinner spinner = (your view).findViewById(**your xml spinner view id**);
     List<String> list = new ArrayList<String>();
     list.add("Phones");
     list.add("Laptops");
     list.add("Tablets");
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>((here if you use Activity use **this** or in fragment use **getContext()**),
         android.R.layout.simple_spinner_item, list);(here put your spinner item xml)
     dataAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
     spinner.setAdapter(dataAdapter);
0 голосов
/ 23 октября 2019

Примечание: Непосредственный доступ к представлениям фрагмента вне фрагмента не является хорошей идеей. Вы должны использовать интерфейсы обратного вызова фрагмента для обработки таких случаев и избежать ошибок. Следующий способ работает, но это не рекомендуется, так как это не очень хорошая практика.

Вы должны установить свой адаптер в классе обратного вызова фрагмента:

@Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view =inflater.inflate(R.layout.fragment_add,container,false);
        Snipper snipper1= view.findViewById(R.id.spinner_add);

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_dropdown_item, list);

        return view;
    }
...