Получить представление фрагмента из FragmentActivity

У меня есть FragmentActivity, где я добавляю Fragment. В зависимости от какой-то ситуации я хочу получить доступ к Buttons из макета этого фрагмента и изменить их прослушиватели кликов.

Что я делаю:

View view = myFragment.getView();
Button myButton = (Button) view.findViewById(R.id.my_button);
myButton.setOnClickListener(new MyClickListener());

Но переменная view всегда null.

Как я могу получить представление о деятельности?


person Drastamat    schedule 10.06.2013    source источник
comment
Добавлен ли мой фрагмент и виден ли он?   -  person Ken Wolf    schedule 10.06.2013
comment
Обратите внимание, что вы вызываете findViewById() в иерархии представлений вашей деятельности, а не view.   -  person laalto    schedule 10.06.2013
comment
Когда вы делаете: Button myButton = (Button) findViewById(R.id.my_button);, вы пытаетесь найти кнопку для вашего текущего представления, которая не является вашей fragment view. Следовательно, он не работает так, как ожидалось.   -  person The Dark Knight    schedule 10.06.2013
comment
Да это так. Я пытаюсь реализовать функцию SlidingMenu. На самом деле, до добавления этой функции все работало нормально.   -  person Drastamat    schedule 10.06.2013
comment
@laalto, извините, опечатка. Отредактировал пост.   -  person Drastamat    schedule 10.06.2013
comment
вы сделали это в методе onActivityCreated?   -  person Volodymyr Yatsykiv    schedule 10.06.2013
comment
@VolodymyrYatsykiv, нет, в onCreate() функции FragmentActivity   -  person Drastamat    schedule 10.06.2013


Ответы (5)


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

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class DetailFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.details, container, false);
        return view;
    }


    public void setSettings(){
        Button button = (Button) getView().findViewById(R.id.my_button);
        button.setOnClickListener(new MyClickListener());
    }
}
person Jarvis    schedule 10.06.2013
comment
getView() может возвращать значение null, и это происходит во многих случаях. Если я вызову setSettings из метода OnCreate Activity, будет выбрано исключение - person Varvara Kalinina; 13.01.2016
comment
@VarvaraKalinina Итак, getView работает только внутри фрагмента, а не из действия? - person John; 07.08.2019
comment
Только что проверил его с действием, в действии нет такого метода, как getView (ссылка на документ), и вам нужно сохранить переменную-член для корневого представления xml, что на самом деле не идеально для сохранения ссылки на родительский элемент. ссылка на документ для фрагмента, который показывает метод getView - person John; 07.08.2019
comment
@John В случае Activity вы можете использовать findViewById(android.R.id.content) - person Varvara Kalinina; 07.08.2019

попробуй это:

public class YourFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          return inflater.inflate(R.layout.your_fragment, null);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        View view = getView();
        if(view != null) {
            view.findViewById(R.id.my_button).setOnClickListener(new MyClickListener());
        }
    }
}

этот код должен работать нормально. Я надеюсь, что это поможет вам.

person Volodymyr Yatsykiv    schedule 10.06.2013

Чтобы установить OnClickListeners во фрагментах, переопределите onViewCreated в классе фрагментов.

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    view.findViewById(R.id.yourId).setOnClickListener(this);
    //or
    getActivity().findViewById(R.id.yourId).setOnClickListener(this);
}

Я пытался установить таймер для автоматической перезагрузки веб-просмотра во фрагменте, и этот метод был единственным, что сработало для меня. Мой проект находится на github< /а>.

Источник: этот ответ

person JB0x2D1    schedule 27.09.2015

Когда вы инициализируете свою кнопку внутри класса, расширяющего Fragment, лучше делать это внутри метода onViewCreated(). Это гарантирует, что представление уже существует.

person Alex P    schedule 10.12.2015

Просто используйте метод getRootView(), чтобы получить данные вашего фрагмента в Activity.

//below block of code write in activity.

EditText et = (EditText) v.getRootView().findViewById(R.id.name);
Log.d("Name", et.getText().toString());

имя - это поле фрагмента.

person Aman Gupta - ΔMΔN    schedule 23.11.2016