Я пытаюсь создать 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
метода есть ошибка, которая утверждает, что метод не определен.
Ответы:
Используйте getView () или параметр View из реализации
onViewCreated
метода. Возвращает корневое представление для фрагмента (возвращенногоonCreateView()
методом) . С этим вы можете позвонитьfindViewById()
.Как
getView()
работает только послеonCreateView()
, вы не можете использовать его внутриonCreate()
илиonCreateView()
методы фрагмента.источник
ImageView
это исходит от раздутого макета - подробности смотрите в моем ответе. В противном случае, onCreateView - подходящее место для этого @ N-onActivityCreated()
это рекомендуемое место для поиска и хранения ссылок на ваши представления. Вы должны очистить эти сохраненные ссылки, установив их обратноnull
в,onDestroyView()
иначе вы утечетеActivity
.Вам нужно раздувать вид и вызов фрагмента
findViewById()
наView
него возвращается.источник
NullPointerException
.Внутри
Fragment
класса вы получите метод переопределения onViewCreated (), в котором вы всегда должны инициализировать ваши представления, так как в этом методе вы получаете объект представления, с помощью которого вы можете найти ваши представления следующим образом:Всегда помните , в случае фрагмента , что
onViewCreated()
метод не вызывается автоматически , если вы возвращаете нуль илиsuper.onCreateView()
изonCreateView()
метода. Он будет называться по умолчанию в случае , если вListFragment
качествеListFragment
возвратаFrameLayout
по умолчанию.Примечание: вы можете получить представление фрагмента в любом месте класса, используя
getView()
один разonCreateView()
успешно выполненный. т.е.источник
view
передано по-onViewCreated
прежнему причины,NullPointerException
но использованиеgetActivity()
в порядке. Есть идеи почему?onCreateView
метода. Я только что отладил, и оказалось, что есть макет (в моем случаеFrameLayout
). При этом, когда я пытаюсь найти элемент, он возвращаетсяnull
. Почему это происходит?Я понимаю, что это старый вопрос, но преобладающий ответ оставляет желать лучшего.
Вопрос не ясен, что требуется
imageView
- мы передаем его обратно как представление или просто сохраняем ссылку на будущее?В любом случае, если
ImageView
это исходит от раздутого макета, правильный способ сделать это будет:источник
Сначала получите вид фрагмента, а затем получите из этого вида свой ImageView.
источник
Вы также можете сделать это в
onActivityCreated
методе.Как они делают здесь: http://developer.android.com/reference/android/app/Fragment.html (устарело на уровне API 28)
а также
возможны
источник
getView()
даст корневой видисточник
Вы можете переопределить onViewCreated (), который вызывается сразу после того, как все представления были завышены. Это правильное место для заполнения
View
переменных- членов вашего фрагмента . Вот пример:источник
Внутри
Fragment
класса мы получаемonViewCreated()
метод переопределения, где мы всегда должны инициализировать наши представления, потому что в этом методе мы получаемview
объект. Используя этот объект, мы можем найти наши взгляды, как показано ниже:источник
Метод getView () не будет работать с фрагментами вне OnCreate и аналогичными методами.
У вас есть два способа, передать представление функции в oncreate (что означает, что вы можете запускать свои функции только при создании представления) или установить представление как переменную:
источник
1) сначала надуйте макет фрагмента, затем вы можете использовать findviewbyId.
источник
источник
использование
это будет работать
источник
согласился с заходом
findViewById()
на Вью.источник
Замечания :
На уровне API 26 вам также не нужно специально приводить результат findViewById, поскольку он использует логический вывод для своего типа возвращаемого значения.
Так что теперь вы можете просто сделать,
источник
Согласно документации по API уровня 11
Ссылка, в Back Stack http://developer.android.com/reference/android/app/Fragment.html
короткий код
источник
Использование
getView()
возвращает представление фрагмента, затем вы можете вызватьfindViewById()
доступ к любому элементу представления в представлении фрагмента.источник
Попробуйте это у меня работает
источник
Лучший способ реализовать это следующим образом:
Таким образом, rootView можно использовать для каждого элемента управления, определенного в макете xml, и таким образом код становится намного чище.
Надеюсь это поможет :)
источник
1) Объявите свой файл макета.
2) Затем получите идентификатор вашего взгляда
источник
Используйте плагин gradle skeleton , он автоматически сгенерирует классы держателей вида со ссылкой на ваш макет.
Теперь, если у вас есть
ImageView
объявление в вашемmy_layout.xml
файле, он автоматически сгенерирует класс myLayout для вас.источник
Попробуй это:
источник
пытаться
источник
getView()
позжеВы можете позвонить
findViewById()
с объектом деятельности вы получаете внутри вашегоpublic void onAttach(Activity activity)
метода внутри вашего фрагмента.Сохраните Activity в переменную, например:
В классе Fragment :
private Activity mainActivity;
вonAttach()
методе:this.mainActivity=activity;
Наконец, выполните каждый findViewById через переменную:
mainActivity.findViewById(R.id.TextView);
источник
Есть еще один метод, который называется onViewCreated.
источник
Внутри метода onCreateView
1) сначала нужно надуть макет / вид, который вы хотите добавить, например. LinearLayout
2) Затем вы можете найти свой идентификатор imageView из макета
3) вернуть раздутый макет
источник
Вы должны раздуть вид
источник
Во фрагментах нам нужно представление этого окна, чтобы мы создали onCreateView этого фрагмента.
Затем получите представление и используйте его для доступа к каждому идентификатору представления этих элементов представления.
источник
Макет Inflater входит в картину здесь. Layout Inflater - это класс, который позволяет нам использовать представления XML в коде Java. Таким образом, вы можете накачать корневое представление XML в переменной v с помощью следующего кода. А затем с помощью v вы можете найти дочерние представления корневого представления v.
источник
Самый простой способ использовать такие вещи - использовать нож для масла. Таким образом, вы можете добавить столько Onclciklisteners просто с помощью @OnClick (), как описано ниже:
источник