findViewById во фрагменте
Я пытаюсь создать ImageView во фрагменте, который будет ссылаться на элемент ImageView, который я создал в XML для фрагмента. Тем не менее findViewById
Метод работает, только если я расширяю класс Activity. Есть ли в любом случае, что я могу использовать его также во Fragment?
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
Метод имеет ошибку, которая утверждает, что метод не определен.
37 ответов
Используйте 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()
методы фрагмента.
Вам нужно раздуть вид фрагмента и позвонить 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;
}
Внутри 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");
Я понимаю, что это старый вопрос, но преобладающий ответ оставляет желать лучшего.
Вопрос не ясен, что требуется от 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;
}
}
Сначала получите вид фрагмента, а затем получите из этого вида свой 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;
}
Внутри Fragment
класс мы получаем onViewCreated()
переопределить метод, в котором мы всегда должны инициализировать наши представления, потому что в этом методе мы получаем view
объект. Используя этот объект, мы можем найти наши представления, как показано ниже:
class MyFragment extends Fragment {
private ImageView imageView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.my_fragment_layout, container, false);
}
@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);
}
}
Вы также можете сделать это в onActivityCreated
Метод.
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
Like they do here: http://developer.android.com/reference/android/app/Fragment.html (deprecated in API level 28)
getView().findViewById(R.id.foo);
а также
getActivity().findViewById(R.id.foo);
возможны
getView()
даст корневой вид
View v = getView().findViewByID(R.id.x);
Вы можете переопределить 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);
}
}
Метод 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);
}
1) сначала надуйте макет фрагмента, затем вы можете использовать findviewbyId .
View view = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
return view;
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);
Согласился с вызовом 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;
}
Замечания:
Начиная с уровня 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;
}
Использование
imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);
imageview = (ImageView) getActivity().findViewById(R.id.imageview1);
это будет работать
С помощью getView()
возвращает вид фрагмента, затем вы можете позвонить findViewById()
чтобы получить доступ к любому элементу представления в представлении фрагмента.
Попробуйте это у меня работает
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);
}
}
Согласно документации по 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;
}
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);
}
ImageView imageView;
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.testclassfragment, container, false);
imageView = view.findViewById(R.id.my_image);
return view;
}
Пытаться
private View myFragmentView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
myFragmentView = inflater.inflate(R.layout.myLayoutId, container, false);
myView = myFragmentView.findViewById(R.id.myIdTag)
return myFragmentView;
}
Попробуй это:
View v = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView img = (ImageView) v.findViewById(R.id.my_image);
return v;
Есть еще один метод, который называется onViewCreated.
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}
Лучший способ реализовать это следующим образом:
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, и таким образом код становится намного чище.
Надеюсь это поможет:)
Используйте плагин gradle skeleton, он автоматически сгенерирует классы держателей вида со ссылкой на ваш макет.
public class TestClass extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
MyLayout myLayout = new MyLayout(inflater, container, false);
myLayout.myImage.setImageResource(R.drawable.myImage);
return myLayout.view;
}
}
Теперь, если у вас есть ImageView
заявлено в вашем my_layout.xml
файл, он автоматически сгенерирует класс myLayout для вас.
//here you can do it by
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
// Inflate the layout for this fragment
final View view = inflater.inflate(R.layout.fragment_apple, container,
false);
ist = view.findViewById(R.id.linearLink);
second = view.findViewById(R.id.linearPhone);
return view;
Мне нравится, чтобы все было структурировано. Вы можете поступить так.
Сначала инициализируйте представление
private ImageView imageView;
Затем переопределите OnViewCreated
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
findViews(view);
}
Затем добавьте метод void для поиска представлений
private void findViews(View v) {
imageView = v.findViewById(R.id.img);
}
Ты можешь позвонить findViewById()
с объектом деятельности вы получаете внутри вашего public void onAttach(Activity activity)
метод внутри вашего фрагмента.
Сохраните Activity в переменную, например:
В классе Фрагмент:private Activity mainActivity;
в onAttach()
метод:this.mainActivity=activity;
Наконец, выполните каждый findViewById через переменную:mainActivity.findViewById(R.id.TextView);
Макет Inflater входит в картину здесь. Layout Inflater - это класс, который позволяет нам использовать представления XML в коде Java. Таким образом, вы можете накачать корневое представление XML в переменной v с помощью следующего кода. А затем с помощью v вы можете найти дочерние представления корневого представления v.
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;
}
}
getView()
работает только после onCreateView()
завершено, поэтому вызвать его из onPostCreate()
:
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
}