GetView возвращает null, когда фрагмент был создан из действия
У меня есть приложение для рабочего планшета, которое я теперь пытаюсь сделать и на телефонах.
На столе есть два фрагмента на экране фрагмента списка и фрагмента детали.
Когда на телефоне появляется фрагмент списка и создается новое действие при нажатии элемента списка.
Эта операция просто создает фрагмент в методе onCreate()
и записывает его на экран следующим образом.
// Place an DeallDetailsFragment as our content pane
DealDetailsFragment f = new DealDetailsFragment();
getFragmentManager().beginTransaction().add(android.R.id.content, f).commit();
getFragmentManager().executePendingTransactions();
Это работает как ожидалось, однако изнутри этой деятельности мне нужно сообщить фрагменту, какие детали загружать и отображать. В моем классе DealDetailsFragment у меня есть метод updateDeal()
, который обновляет содержимое следующим образом.
if (deal==null) { // could be null if user presses the loading deals list item before it loads
return;
}
this.deal=deal;
if (dealTitle==null) { // get the view objects only once
holder = new ViewHolder();
holder.dealHeat=(TextView) getView().findViewById(R.id.dealDetails_heat_textView);
holder.dealPrice=(TextView) getView().findViewById(R.id.dealDetails_price_textView);
holder.dealRetailer=(TextView) getView().findViewById(R.id.dealDetails_retailer_textView);
holder.dealTitle=(TextView) getView().findViewById(R.id.dealDetails_title_textView);
holder.dealDesc=(TextView) getView().findViewById(R.id.dealDetails_desc_textView);
holder.goToButton= (LinearLayout) getView().findViewById(R.id.dealDetails_goToDeal);
holder.dealImage=(ImageView) getView().findViewById(R.id.dealDetails_imageView);
holder.postedBy=(TextView) getView().findViewById(R.id.dealDetails_poster_textView);
holder.datePosted=(TextView) getView().findViewById(R.id.dealDetails_date_textView);
getView()
возвращает значение null, когда приложение запускается на телефоне, где показан только один фрагмент.
Любые идеи? К сожалению, примеров фрагментов в Интернете не так много.
Ответы
Ответ 1
Переместите вызов метода, который будет выполняться во время onCreateView
, и используйте представление, которое вы раздуваете для ссылки вместо getView()
. См. Жизненный цикл фрагмента для получения дополнительной информации: https://developer.android.com/guide/components/fragments.html#Creating
и документация getView()
, которая объясняет, почему он возвращает null до того, как onCreateView(LayoutInflater, ViewGroup, Bundle)
возвращает:
GetView()Получите представление корня для макета фрагмента (тот, который был возвращен onCreateView (LayoutInflater, ViewGroup, Bundle)), если он предоставлен.
https://developer.android.com/reference/android/app/Fragment.html#getView()
Ответ 2
Перемещение метода на onCreateView()
не помогло мне .so... Создать глобальную переменную mView
protected View mView;
и в onCreateView()
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "oncreateView");
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.activity_secure_cloud_drive_folder, container, false);
this.mView = view;
return view;
}
и замените все ваши getView()
на mView
Ответ 3
Вы должны проверить жизненный цикл Android, чтобы понять, ПОЧЕМУ, что он равен нулю
onAttach (...).
Добавлена первая функция, называемая при создании фрагмента, onAttach(), но на самом деле никакого представления не было создано. Поэтому, когда вы пытаетесь получить доступ к этому вызову, возвращается null.
Следующая функция onCreate()... но пока нет созданного представления!!!!
Третья функция называется onCreateView(), и она здесь, где вы должны указать, какой вид связан с этим фрагментом.... И это только из этого вызова, где существует объект представления и к ним можно получить доступ.
Прочитайте и изучите полный жизненный цикл здесь.
Привет
Ответ 4
Вы можете исправить это, поставив свой код внутри метода onViewCreated()
, который вы должны переопределить. Не забудьте вызвать super()
на нем.
Ответ 5
он становится нулевым в основном потому, что вы вызываете getview()
перед тем, как раздувается представление. Создайте объект View
и заполните с помощью inflater
, а затем найдите элемент интерфейса пользователя, см. Код ниже
View view = inflater.inflate(R.layout.fragment_albumslist, container, false);
TextView t= (TextView)view.findViewById(R.id.txtTest);
t.setText(strtext);
return view;
Ответ 6
Поскольку функция onCreate() вызывается перед onCreateView(), независимо от того, надуйте ли вы представление в onCreateView() или нет, вы не получите ничего через getView() в onCreate(), потому что за это время onCreate ( ) еще не вызывается.
![Android Lifecycle]()