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 53

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 () еще не вызывался .

Android Lifecycle

он будет нулевым, в основном потому, что вы называете 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;