Подтвердить что ты не робот

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, когда приложение запускается на телефоне, где показан только один фрагмент.

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

4b9b3361

Ответ 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