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, когда приложение запускается на телефоне, где отображается только один фрагмент.
какие идеи? К сожалению, в Интернете не так много примеров фрагментов.
6 ответов:
переместить вызов метода, который будет выполняться во время
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()
перемещение метода
onCreateView()
не помогло me.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
Вы можете исправить это, поставив свой код внутри
onViewCreated()
-метод, который нужно переопределить. Не забудьте позвонитьsuper()
на нем.
вы должны проверить жизненный цикл Android, чтобы понять, почему он равен нулю onAttach(...) функция.
первая функция, вызываемая при создании фрагмента, добавляется onAttach(), но на самом деле никакого представления не было создано. Вот почему null возвращается, когда вы пытаетесь получить доступ в этот призыв.
следующая функция onCreate ()... но там еще не создан вид!!!!
третья функция называется onCreateView(), и именно здесь вы должны указать, какой вид придает этому фрагменту.... И только из этого вызова существует объект представления, к которому можно получить доступ.
Читайте и изучайте полный жизненный цикл здесь.
поздравления
потому что onCreate () вызывается перед onCreateView (), независимо от того, раздуваете ли Вы представление в onCreateView () или нет, вы ничего не получите через getView () в onCreate (), потому что в это время onCreate () еще не вызывался .
он будет нулевым, в основном потому, что вы называете
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;