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 ]

10 голосов
/ 20 декабря 2014
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);  
9 голосов
/ 29 мая 2013

согласился с вызовом findViewById() на виде.

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;
}
8 голосов
/ 13 октября 2014

Согласно документации по уровню API 11

Ссылка, в Back Stack http://developer.android.com/reference/android/app/Fragment.html

короткий код

/**
 * The Fragment's UI is just a simple text view showing its
 * instance number.
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.hello_world, container, false);
    View tv = v.findViewById(R.id.text);
    ((TextView)tv).setText("Fragment #" + mNum);
    tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));
    return v;
}
8 голосов
/ 11 июля 2013

Использование getView() возвращает представление фрагмента, затем вы можете вызвать findViewById() для доступа к любому элементу представления в представлении фрагмента.

8 голосов
/ 29 марта 2015

Используйте

imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);

imageview = (ImageView) getActivity().findViewById(R.id.imageview1);

это будет работать

8 голосов
/ 08 октября 2017

Примечание:

На уровне API 26 вам также не нужно специально приводить результат findViewById, поскольку он использует логический вывод для своего типа возвращаемого значения.

Так что теперь вы можете просто сделать,

public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container, 
                         Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView =  view.findViewById(R.id.my_image); //without casting the return type
     return view;
}
7 голосов
/ 08 декабря 2016

Попробуйте это у меня работает

public class TestClass extends Fragment {
    private ImageView imageView;

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

    private void findViews(View view) {
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}
5 голосов
/ 28 августа 2014

Лучший способ реализовать это следующим образом:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

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

Таким образом, rootView можно использовать для каждого элемента управления, определенного в макете xml, и таким образом код намного чище.

Надеюсь, это поможет:)

5 голосов
/ 01 февраля 2016

1) Объявите свой файл макета.

public View onCreateView(LayoutInflater inflater,ViewGroup container, 
                                 Bundle savedInstanceState) {
    return inflate(R.layout.myfragment, container, false);
}

2) Затем получите идентификатор вашего представления

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    TextView nameView = (TextView) view.findViewById(R.id.textview1);
}
4 голосов
/ 13 июня 2019

Внутри Fragment класса вы получите onViewCreated() метод переопределения, где вы всегда должны инициализировать свои представления, так как в этом методе вы получаете view объект, используя который вы можете найтиваши взгляды как:

class MyFragment extends Fragment {
    private ImageView imageView;

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

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) 
        super.onViewCreated(view, savedInstanceState);

        //initialize your view here for use view.findViewById("your view id")
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}
...