Поиск фрагмента Просмотр активности. Android findFragmentByTag (строковый тег) возвращает ноль - PullRequest
1 голос
/ 01 апреля 2012

Я пытаюсь получить представление Spinner из добавленного Fragment к своей деятельности, но мне кажется, что я не могу получить ни фрагмент, ни представление.

У меня есть Activity, которая добавляет Fragment к LinearLayout, компоновка фрагмента основана на «extra», который исходит из намерения Activity. Все отображается правильно, и я могу видеть все виды фрагмента, но по какой-то причине, когда я вызываю findFragmentByTag(String tag), он возвращает ноль, и поэтому я не могу вызвать getView ().

Вот как я добавляю фрагмент кода в свою деятельность:

...onCreate(){
    ...
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    Fragment fr = new Fragment(){
        @Override
        public View onCreateView(LayoutInflater inflater,
                ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(layoutID, container, false);
        }
    };
    ft.add(R.id.formsListActivity_Container, fr, "form_fragment_tag");

    ft.commit();
    ...

}

Затем я пытаюсь получить такой фрагмент и получить представление счетчика, чтобы добавить массив строк:

Fragment f = fm.findFragmentByTag("form_fragment_tag");
Spinner spinner = (Spinner) f.getView().findViewById(R.id.city_spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
        R.array.city_list, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

Но я получаю исключение null, потому что findFragmentByTag () возвращает null

Что я делаю не так? Я проверил код несколько раз, и теги совпадают. Я также удостоверился, что идентификатор счетчика находится в файле макета XML правильно, и фрагмент загружает правильный макет XML, потому что я могу видеть его (если комментарий, то получить представление из части фрагмента).

Ответы [ 3 ]

8 голосов
/ 02 апреля 2012

Я решил проблему, похоже, что в зависимости от жизненного цикла как действия, так и фрагмента к моменту выполнения findFragmentById () в onCreate () фрагмент не был «фактически создан», я проверилэто путем добавления простой кнопки к макету и создания метода, при котором при нажатии на кнопку счетчик будет заполняться данными.

Но, конечно, я не хочу, чтобы пользователь нажимал кнопку «Загрузить»чтобы заполнить счетчик, вместо этого я применил к своему фрагменту метод public void onActivityCreated().

Для справки вот мой код фрагмента:

 Fragment fr = new Fragment(){

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(layoutID, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Spinner spinner = (Spinner) this.getView().findViewById(R.id.city_spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.city_list, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
    }

 };
2 голосов
/ 30 января 2014

У меня была та же проблема, которую я решил, вызвав findFragmentByTag() в методе жизненного цикла

protected void onStart()
{
}

.

0 голосов
/ 01 апреля 2012

Попробуйте изменить false на true в линии раздувания.

return inflater.inflate(layoutID, container, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...