От новичка до гуру: Курсы программирования на CyberDuff

Android: представление содержимого еще не создано при использовании списка во фрагменте?

У меня есть фрагмент с двумя вкладками, каждая вкладка имеет соответствующий фрагмент. каждая вкладка имеет свой список, который загружается с сервера. но мои приложения столкнулись с исключением, например

java.lang.RuntimeException: невозможно запустить действие ComponentInfo{com.oj.bs/com.oj.bs.ProjectFragActivity}: java.lang.IllegalStateException: представление содержимого еще не создано

Я не могу понять, где проблема. Может ли кто-нибудь сказать мне, что я делаю неправильно?

Ниже приведен мой класс фрагментов

public class ResidentialFragActivity extends SherlockListFragment implements ActionBar.TabListener{

ListView listview;
ListView resListviewId;
...
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActivity().setContentView(R.layout.residential_list);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle saved) {

    View view = inflater.inflate(R.layout.residential_list,container, false);
    resListviewId = (ListView)view.findViewById(R.id.resProjListView);
    projectList = new ArrayList<HashMap<String,String>>();
    new LoadProjects().execute();

    ListView listview = getListView();
    listview.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int arg2,
                long arg3) {
            Intent href = new Intent(getSherlockActivity(), ProjectDetailActivity.class);

                    String proj_id = ((TextView) view.findViewById(R.id.projectId)).getText().toString();  
                        href.putExtra("proj_id", proj_id);     
            getSherlockActivity().startActivity(href);
        }
    });
    if (container == null) {
        return null;
    }
    return view;
}

public void onStart() {
    super.onStart();
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    ft.add(android.R.id.content,this,"residential");
    ft.attach(this);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    ft.detach(this);
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

//inner class for network operation
private class LoadProjects extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        ..........
        //get data from the latest server
        String jsonpProjList = ResdProj.makeHttpReqToSrvr(projectUrl, "POST", projRes);

        return null;
    }
    @Override
    protected void onPostExecute(String result) {

        getSherlockActivity().runOnUiThread(new Runnable() {

            @Override
            public void run() {
                ListAdapter projAdapter = new SimpleAdapter(getSherlockActivity(),
                        projectList, R.layout.residential_list_item, 
                        new String[] {PROJ_ID,PROJ_NAME}, new int[] 
                            {R.id.projectId,R.id.projectName});
                //updating the UI
                setListAdapter(projAdapter);
            }
        });
    }
}

Спасибо в Advance


  • проверьте мой ответ, приведенный ниже. 29.04.2013

Ответы:


1

Прежде всего, я вижу много "плохих вещей" в вашем коде. Первое, что я бы никогда не сделал и не очень уверен, что это сработает, это getActivity().setContentView(R.layout.residential_list); . Вы можете добавить Fragments в FragmentActivity, используя xml или добавив непосредственно в FrameLayout. Просто посмотрите пример в Android для Fragments, чтобы узнать, как добиться этого фрагментов. .

Во-вторых, нет необходимости использовать этот runOnUiThread в onPostExecute(), потому что он уже работает в потоке пользовательского интерфейса.

И последнее, что я могу придумать, сначала установить содержимое на FragmentActivity, добавить вкладки на ActionBar и прикрепить свои фрагменты к первой/второй вкладке. И после этого вы можете правильно заполнить свои ListView данными, используя AsyncTask.

29.04.2013
  • Я согласен с вашими первыми двумя вещами, но я уже добавил вкладки из другого класса, когда нажимаю на первую вкладку Загрузка класса ResidentialFragActivity. 29.04.2013
  • Вы добавляете FragmentActivity в качестве содержимого вкладки? 29.04.2013
  • да, мой другой класс расширяет SherlockFragmentActivity из этого класса, например. Вкладка Tab = actionBar.newTab().setTabListener(new ResidentialFragActivity()).setIcon(R.drawable. Residential); actionBar.addTab (вкладка); 29.04.2013

  • 2

    Я думаю, что это проблема, но не уверен.

     new LoadProjects().execute();
    

    вы вызываете это до создания listview, поэтому view нет, поэтому вызывайте после создания listview.

    обновление:-

    или позвоните new LoadProjects().execute(); внутри

    `onResume()`.it will get called after `onCreate()` or `onCreateView()`
    
    29.04.2013

    3

    Таким образом, вы должны помнить, что живете в сумасшедшем мире, где вы можете создать представление для своего фрагмента, и оно отделено от действия, которое его содержит, поэтому ваше представление вашего фрагмента готово, но оно еще не на экране, а ваше «представление содержимого еще не созданный".

    Вы захотите реализовать onActivityCreated в своем фрагменте и вызвать

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    
        new LoadProjects().execute();
    }
    

    оттуда.

    Это гарантирует, что и ваш фрагмент, и активность будут созданы. НО ПОДОЖДИТЕ, есть еще. Также помните, что вы можете оставить свою активность с activity.startActivity(...), и ваш фрагмент все еще может быть рядом (может быть, отсоединен, может быть, исчез). В этом случае onActivityCreated будет вызываться снова, когда ваша активность возобновится и ваш фрагмент будет повторно присоединен. Так что это может вызываться чаще, чем вы хотите сейчас.

    Я оставлю на ваше усмотрение бизнес-логику о том, когда это действительно активировать, или, может быть, если вы покинете действие, можно будет перезагрузить этот контент. Удачи.

    05.02.2014
    Новые материалы

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

    Игра в прятки с данными
    Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

    «Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
    TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

    Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
    Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

    Все о кейсах: Camel, Snake, Kebab & Pascal
    В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..