Как показать мой счетчик в одном фрагменте - PullRequest
0 голосов
/ 26 апреля 2019

Я занимаюсь созданием приложения, и на данный момент я создал два фрагмента, которые станут чем-то вроде «навигации».На втором из двух фрагментов я поставил счетчик, в котором пользователь сможет выбрать конкретную опцию.Все счетчики имеют уникальные идентификаторы, но метод findViewById не может быть разрешен

Все строки находятся в файле XML строк, и когда я попробовал этот счетчик в моем тестовом приложении, он работал

public class Frag2 extends Fragment implements AdapterView.OnItemSelectedListener{

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.frag2_layout, container, false);

        Spinner spinner = findViewById (R.id.spinner1);
        ArrayAdapter.createFromResource(getActivity(), R.array.insulin, android.R.layout.simple_spinner_item);
        ArrayAdapter<CharSequence> adapter;
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        String text = parent.getItemAtPosition(position).toString();
        Toast.makeText(parent.getContext(), text, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

Вращатель должен работать в пределах одного фрагмента, а затем я хотел бы иметь его еще несколько раз

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Это фрагмент, с которым вы имеете дело, а не деятельность.Fragment не расширяет Context или View классы и не имеет этого findViewById метода.

Что вам нужно сделать, это переместить ваш код с onCreateView на onViewCreated, который получаетссылка на корневой вид в качестве параметра.Затем используйте тот же метод, но с этим видом, как показано ниже:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    Spinner spinner = view.findViewById(R.id.spinner1);
    ...
}

Другая вещь, которую вы можете сделать, это заменить:

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.frag2_layout, container, false);

    Spinner spinner = findViewById (R.id.spinner1);
    // I'm not sure how you didn't see all errors when writing code after a return statement.

    ...
}

на:

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.frag2_layout, container, false);

    Spinner spinner = view.findViewById(R.id.spinner1);
    ...

    return view; // after finishing all logic.
}

ОБНОВЛЕНИЕ:

Не видел, что есть такжепроблема с ArrayAdapter.Как уже упоминалось в ответе Csongi77 , необходимо правильно создать экземпляр адаптера.Опять же, фрагмент не может использоваться в качестве контекста, вы должны использовать содержащее действие для этого:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.insulin, android.R.layout.simple_spinner_item);

ArrayAdapter.createFromResource создает и возвращает новый адаптер, и в настоящее время вы просто немедленно утилизируете его, не сохраняя его ссылку.

0 голосов
/ 26 апреля 2019

Я думаю, что сначала вы должны создать экземпляр адаптера следующим образом: ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.insulin, android.R.layout.simple_spinner_item); Пожалуйста, дайте мне знать, если он работает.С уважением, Csongi

...