findViewById во фрагменте - PullRequest
943 голосов
/ 27 июня 2011

Я пытаюсь создать ImageView во фрагменте, который будет ссылаться на элемент ImageView, который я создал в XML для фрагмента.Однако метод findViewById работает, только если я расширяю класс Activity.В любом случае я могу использовать его и во Фрагменте?

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ImageView imageView = (ImageView)findViewById(R.id.my_image);
        return inflater.inflate(R.layout.testclassfragment, container, false);
    }
}

В методе findViewById есть ошибка, которая гласит, что метод не определен.

Ответы [ 33 ]

1347 голосов
/ 27 июня 2011

Используйте getView () или параметр View от реализации метода onViewCreated. Возвращает корневое представление для фрагмента (возвращенного методом onCreateView()) . С этим вы можете позвонить findViewById().

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
    // or  (ImageView) view.findViewById(R.id.foo); 

Поскольку getView() работает только после onCreateView(), вы не можете использовать его внутри onCreate() или onCreateView() методов фрагмента.

594 голосов
/ 27 июня 2011

Вам нужно раздуть представление фрагмента и вызвать findViewById() на View, которое он возвращает.

public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container, 
                         Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
     return view;
}
123 голосов
/ 04 марта 2014

Внутри Fragment класса вы получите 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);
}

Всегда помните, что в случае фрагмента метод onViewCreated() не будет вызываться автоматически, если вы возвращаете нуль или super.onCreateView() из метода onCreateView(). Он будет вызываться по умолчанию в случае ListFragment, поскольку ListFragment возвращает FrameLayout по умолчанию.

Примечание: вы можете получить представление фрагмента в любом месте класса, используя getView() после успешного выполнения onCreateView(). т.е.

getView().findViewById("your view id");
65 голосов
/ 11 апреля 2013

Я понимаю, что это старый вопрос, но преобладающий ответ оставляет желать лучшего.

Вопрос не ясен, что требуется от imageView - мы передаем его обратно как представление или просто сохраняем ссылку на потом?

В любом случае, если ImageView исходит из раздутого макета, правильный способ сделать это будет:

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.testclassfragment, container, false);
        ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
        return v;
    }
}
44 голосов
/ 27 июня 2011

Сначала получите представление фрагмента, а затем получите из этого представления ваш ImageView.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
    return view;
}
23 голосов
/ 10 октября 2013

Вы также можете сделать это методом onActivityCreated.

public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState);
}

Как и здесь: http://developer.android.com/reference/android/app/Fragment.html (устарело на уровне API 28)

getView().findViewById(R.id.foo);

и

getActivity().findViewById(R.id.foo);
*Возможно 1014 *.
18 голосов
/ 03 сентября 2014

getView() даст рут-вид

View v = getView().findViewByID(R.id.x); 
17 голосов
/ 28 марта 2012

Вы можете переопределить onViewCreated (), который вызывается сразу после того, как все представления были раздуты. Это правильное место для заполнения View переменных вашего фрагмента. Вот пример:

class GalleryFragment extends Fragment {
    private Gallery gallery;

    (...)

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        gallery = (Gallery) view.findViewById(R.id.gallery);
        gallery.setAdapter(adapter);
        super.onViewCreated(view, savedInstanceState);
    }
}
15 голосов
/ 30 марта 2014

Метод getView () не будет работать с фрагментами вне OnCreate и аналогичными методами.

У вас есть два способа передать представление в функцию oncreate (что означает, что вы можете толькозапустите ваши функции при создании представления) или установите представление как переменную:

private View rootView;

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

public void doSomething () {
    ImageView thumbnail = (ImageView) rootView.findViewById(R.id.someId);
}
10 голосов
/ 30 января 2018

1) сначала наведите макет фрагмента, затем вы можете использовать findviewbyId.

View view = inflater.inflate(R.layout.testclassfragment, container, false);
             ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
             return view;
...