getView возвращает ноль, когда фрагмент был создан из действия - PullRequest
57 голосов
/ 28 февраля 2012

У меня есть работающее приложение для планшета, которое я сейчас пытаюсь заставить работать и на телефонах. На столе два фрагмента, на экране фрагмент списка и фрагмент сведений. Когда на телефоне появляется фрагмент списка, создается новое действие при нажатии элемента списка. Это действие просто создает фрагмент в методе 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() возвращает ноль, когда приложение запускается на телефоне, где показан только один фрагмент.

Есть идеи? К сожалению, в Интернете не так много примеров фрагментов.

Ответы [ 6 ]

123 голосов
/ 29 февраля 2012

Переместите ваш вызов метода, который будет выполнен во время onCreateView, и используйте представление, которое вы используете для справки, вместо getView(). См. Жизненный цикл фрагмента для получения дополнительной информации: https://developer.android.com/guide/components/fragments.html#Creating

и документация getView(), объясняющая, почему он возвращает ноль до того, как onCreateView(LayoutInflater, ViewGroup, Bundle) вернет:

GetView () Получить корневое представление для макета фрагмента (возвращаемого onCreateView (LayoutInflater, ViewGroup, Bundle)), если оно предусмотрено.

https://developer.android.com/reference/android/app/Fragment.html#getView()

21 голосов
/ 17 августа 2015

Перемещение метода на onCreateView() мне не помогло. Создайте глобальную переменную 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

8 голосов
/ 01 апреля 2016

Вы можете это исправить, поместив свой код в onViewCreated() -метод, который вы должны переопределить.Не забудьте позвонить super() на него.

4 голосов
/ 13 октября 2015

Вы должны проверить жизненный цикл Android, чтобы понять, ПОЧЕМУ он пуст Функция onAttach (...).

Первая функция, вызываемая при создании фрагмента, это onAttach () , но на самом деле представление не было создано. Вот почему возвращается ноль, когда вы пытаетесь получить доступ к этому вызову.

Следующая функция - onCreate () ... но пока еще не создано ни одного представления !!!!

Третья вызываемая функция - onCreateView () , и именно здесь вы должны указать, какое представление прикреплено к этому фрагменту .... И только из этого вызова существует объект представления и можно получить доступ.

Прочитайте и изучите полный жизненный цикл здесь .

Привет

1 голос
/ 20 апреля 2017

Поскольку onCreate () вызывается перед onCreateView (), независимо от того, накачаете ли вы представление в onCreateView () или нет, вы ничего не получите через getView () в onCreate (), потому что в это время onCreate ( ) еще не был вызван .

Android Lifecycle

1 голос
/ 16 октября 2016

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