"内容视图尚未创建"在Android碎片 [英] "Content view not yet Created" on Android Fragments

查看:124
本文介绍了"内容视图尚未创建"在Android碎片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是Android片段与 viewpager 设置。基本上有5个标签,你可以刷卡通过。

4的5包含 ListFragments 方式填充的MySQL表;这是一个的AsyncTask 内完成。当我刷卡非常快,我有时会得到这个错误:

  7月九日至一日:54:01.243:E / AndroidRuntime(19706):致命异常:主要
7月9日至1号:54:01.243:E / AndroidRuntime(19706):java.lang.IllegalStateException:尚未创建内容的浏览
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在COM --- --- MasterCat $ TopFrag $ TopTask.onPostExecute(MasterCat.java:570)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在COM --- --- MasterCat $ TopFrag $ TopTask.onPostExecute(MasterCat.java:1)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在android.os.AsyncTask.finish(AsyncTask.java:631)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在android.os.AsyncTask.access $ 600(AsyncTask.java:177)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:644)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在android.os.Handler.dispatchMessage(Handler.java:99)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在android.os.Looper.loop(Looper.java:137)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在android.app.ActivityThread.main(ActivityThread.java:4928)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在java.lang.reflect.Method.invokeNative(本机方法)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在java.lang.reflect.Method.invoke(Method.java:511)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:791)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
7月9日至1号:54:01.243:E / AndroidRuntime(19706):在dalvik.system.NativeStart.main(本机方法)
 

我还intentionly不使用 ProgressDialog ,因为它使刷卡口吃了不少。

所以,我有两个选择,我需要帮助的方式:

  1. 如何prevent这个错误,并保持列表刷新即使刷卡。

  2. 否则一旦被载入了5段,关闭刷新,而刷卡。换句话说,该列表将保持不变,除非你背出活动的回来。

我倒是preFER选项#1。请让我知道code,你需要看到:

  @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.fragment_layout);


        mSectionsPagerAdapter =新SectionsPagerAdapter(
                getSupportFragmentManager());

        最后的动作条动作条= getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mViewPager =(ViewPager)findViewById(R.id.viewpager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        mViewPager
                .setOnPageChangeListener(新ViewPager.SimpleOnPageChangeListener(){
                    @覆盖
                    公共无效onPageSelected(INT位置){
                        actionBar.setSelectedNavigationItem(位置);

                    }
                });

        的for(int i = 0; I< mSectionsPagerAdapter.getCount();我++){
            actionBar.addTab(actionBar.newTab()
                    .setText(mSectionsPagerAdapter.getPageTitle(I))
                    .setTabListener(本));
        }




    }

    公共无效onTabUnselected(ActionBar.Tab选项卡,
            FragmentTransaction fragmentTransaction){

    }

    @覆盖
    公共无效的onSaveInstanceState(包savedInstanceState){
            super.onSaveInstanceState(savedInstanceState);
        }

    @覆盖
    公共无效onRestoreInstanceState(包savedInstanceState){
        super.onRestoreInstanceState(savedInstanceState);

    }

    公共无效onTabSelected(ActionBar.Tab选项卡,FragmentTransaction英尺){
        mViewPager.setCurrentItem(tab.getPosition());
    }

    公共无效onTabReselected(ActionBar.Tab选项卡,
            FragmentTransaction fragmentTransaction){
    }

    公共类SectionsPagerAdapter扩展FragmentPagerAdapter {

        公共SectionsPagerAdapter(FragmentManager FM){
            超(FM);
        }

        @覆盖
        公共片段的getItem(INT位置){
            片f = NULL;
            开关(位置){
            情况下0:{
                F =新MasterFrag();
                捆绑的args =新包();

                f.setArguments(参数);
                打破;
            }
            情况1: {
                F =新FeaturedFrag();
                捆绑的args =新包();

                f.setArguments(参数);
                打破;
            }
            壳体4:{
                F =新TopFrag();
                捆绑的args =新包();

                f.setArguments(参数);
                打破;
            }
            情况3:{
                F =新NewFrag();
                捆绑的args =新包();

                f.setArguments(参数);
                打破;
            }
            案例2:{
                F =新TrendFrag();
                捆绑的args =新包();

                f.setArguments(参数);
                打破;
            }
            默认:
                抛出新抛出:IllegalArgumentException(没有这么多的片段:
                        +位置);
            }

            返回F;

        }
 

另外,在LogCat中引用的线570涉及一种getListView()一个AsyncTask的其是ListFragment的内侧上面未示出的内部。

修改

添加5片段中的一个 - 在LogCat中引用的一个 - TopFrag

 类TopTask扩展的AsyncTask<字符串,字符串,太虚> {
        InputStream的是= NULL;
        字符串结果=;

        @覆盖
        保护无效doInBackground(字符串... PARAMS){
            字符串url_select =htt​​p://www.---.com/---/---.php;

            HttpClient的HttpClient的=新DefaultHttpClient();
            HttpPost httpPost =新HttpPost(url_select);
            ArrayList的<的NameValuePair>参数=新的ArrayList<的NameValuePair>();
            param.add(新BasicNameValuePair(顶,顶级));

            尝试 {
                httpPost.setEntity(新UrlEn codedFormEntity(参数));
                HTT presponse HTT presponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = HTT presponse.getEntity();

                //读取内容
                是= httpEntity.getContent();

            }赶上(例外五){

                Log.e(log_tag,错误的HTTP连接+ e.toString());
            }
            尝试 {
                的BufferedReader BR =新的BufferedReader(
                        新的InputStreamReader(是));
                StringBuilder的SB =新的StringBuilder();
                串线=;
                而((行= br.readLine())!= NULL){
                    sb.append(行+\ N);
                }
                is.close();
                结果= sb.toString();

            }赶上(例外五){
                // TODO:处理异常
                Log.e(log_tag,错误转换结果+ e.toString());
            }

            返回null;

        }

        保护无效onPostExecute(空V){

            字符串项,猫;
            尝试 {
                JSONArray jArray =新JSONArray(结果);
                JSONObject的json_data = NULL;
                的for(int i = 0; I< jArray.length();我++){
                    json_data = jArray.getJSONObject(ⅰ);
                    项目= json_data.getString(项目);
                    猫= json_data.getString(类);


                    items.add(项目);
                    cats.add(猫);



                }
            }赶上(JSONException E1){
                Toast.makeText(getActivity(),没有热门项目找到,
                        Toast.LENGTH_LONG).show();
            }赶上(ParseException的E1){
                e1.printStackTrace();
            }

            ListView控件的ListView;
            ListView控件= getListView();
            listView.setTextFilterEnabled(真正的);

            listView.setOnItemClickListener(新OnItemClickListener(){

                公共无效onItemClick(适配器视图<>为arg0,查看ARG1,
                        INT ARG2,长ID){
           // 编辑

                }
            });

            MasterCatObject [] MCO =新MasterCatObject [items.size()];
            INT索引= 0;

            对于(@燮pressWarnings(未使用)
            字符串我:项目){
                MCO [指数] =新MasterCatObject(items.get(指数),
                        cats.get(索引));
                指数++;
            }

            适配器=新AllTimeAdapter(getActivity(),MCO);
            setListAdapter(适配器);

        }
    }

}
 

解决方案

 在android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
在COM --- .---。MasterCat $ TopFrag $ TopTask.onPostExecute(MasterCat.java:570)
 

你的 TopTask.onPostExecute()摸不得的UI,而该片段尚未(在 onCreateView )不再(在 onDestroyView )显示/。是根本不存在的ListView 就可以得到。

你可以做这里是更新所使用的 ListView中的数据结构,以便在下一次清单得出的新数据包括在内。

I am using Android Fragments with a viewpager setup. Basically there are 5 tabs you can swipe through.

4 of the 5 contain ListFragments that are populated by MySQL tables; this is done inside of an AsyncTask. When I swipe very fast I sometimes get this error:

09-01 07:54:01.243: E/AndroidRuntime(19706): FATAL EXCEPTION: main
09-01 07:54:01.243: E/AndroidRuntime(19706): java.lang.IllegalStateException: Content view not yet created
09-01 07:54:01.243: E/AndroidRuntime(19706):    at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at com.---.---.MasterCat$TopFrag$TopTask.onPostExecute(MasterCat.java:570)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at com.---.---.MasterCat$TopFrag$TopTask.onPostExecute(MasterCat.java:1)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at android.os.AsyncTask.finish(AsyncTask.java:631)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at android.os.Looper.loop(Looper.java:137)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at android.app.ActivityThread.main(ActivityThread.java:4928)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at java.lang.reflect.Method.invokeNative(Native Method)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at java.lang.reflect.Method.invoke(Method.java:511)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
09-01 07:54:01.243: E/AndroidRuntime(19706):    at dalvik.system.NativeStart.main(Native Method)

I have intentionly not used a ProgressDialog because it makes swiping stutter quite a bit.

So I have two options and I need help either way:

  1. How to prevent this error and keep the list refreshing even while swiping.

  2. OR once the 5 fragments are loaded, turn off 'refresh while swiping'. In other words, the lists will stay the same unless you back out of the Activity and come back.

I'd prefer option #1. Please let me know what code you need to see:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_layout);


        mSectionsPagerAdapter = new SectionsPagerAdapter(
                getSupportFragmentManager());

        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        mViewPager
                .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);

                    }
                });

        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
            actionBar.addTab(actionBar.newTab()
                    .setText(mSectionsPagerAdapter.getPageTitle(i))
                    .setTabListener(this));
        }




    }

    public void onTabUnselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {

    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
            super.onSaveInstanceState(savedInstanceState);
        }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

    }

    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        mViewPager.setCurrentItem(tab.getPosition());
    }

    public void onTabReselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
    }

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Fragment f = null;
            switch (position) {
            case 0: {
                f = new MasterFrag();
                Bundle args = new Bundle();

                f.setArguments(args);
                break;
            }
            case 1: {
                f = new FeaturedFrag();
                Bundle args = new Bundle();

                f.setArguments(args);
                break;
            }
            case 4: {
                f = new TopFrag();
                Bundle args = new Bundle();

                f.setArguments(args);
                break;
            }
            case 3: {
                f = new NewFrag();
                Bundle args = new Bundle();

                f.setArguments(args);
                break;
            }
            case 2: {
                f = new TrendFrag();
                Bundle args = new Bundle();

                f.setArguments(args);
                break;
            }
            default:
                throw new IllegalArgumentException("not this many fragments: "
                        + position);
            }

            return f;

        }

Also, line 570 referenced in the LogCat pertains to a getListView() inside of an AsyncTask which is inside of a ListFragment not shown above.

EDIT:

Adding one of the 5 Fragments - the one referenced in LogCat - "TopFrag"

class TopTask extends AsyncTask<String, String, Void> {
        InputStream is = null;
        String result = "";

        @Override
        protected Void doInBackground(String... params) {
            String url_select = "http://www.---.com/---/---.php";

            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url_select);
            ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
            param.add(new BasicNameValuePair("Top", "Top"));

            try {
                httpPost.setEntity(new UrlEncodedFormEntity(param));
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();

                // read content
                is = httpEntity.getContent();

            } catch (Exception e) {

                Log.e("log_tag", "Error in http connection " + e.toString());
            }
            try {
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(is));
                StringBuilder sb = new StringBuilder();
                String line = "";
                while ((line = br.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                result = sb.toString();

            } catch (Exception e) {
                // TODO: handle exception
                Log.e("log_tag", "Error converting result " + e.toString());
            }

            return null;

        }

        protected void onPostExecute(Void v) {

            String item, cat;
            try {
                JSONArray jArray = new JSONArray(result);
                JSONObject json_data = null;
                for (int i = 0; i < jArray.length(); i++) {
                    json_data = jArray.getJSONObject(i);
                    item = json_data.getString("item");
                    cat = json_data.getString("category");


                    items.add(item);
                    cats.add(cat);



                }
            } catch (JSONException e1) {
                Toast.makeText(getActivity(), "No Top Items Found",
                        Toast.LENGTH_LONG).show();
            } catch (ParseException e1) {
                e1.printStackTrace();
            }

            ListView listView;
            listView = getListView();
            listView.setTextFilterEnabled(true);

            listView.setOnItemClickListener(new OnItemClickListener() {

                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int arg2, long id) {
           // edit

                }
            });

            MasterCatObject[] mco = new MasterCatObject[items.size()];
            int index = 0;

            for (@SuppressWarnings("unused")
            String i : items) {
                mco[index] = new MasterCatObject(items.get(index),
                        cats.get(index));
                index++;
            }

            adapter = new AllTimeAdapter(getActivity(), mco);
            setListAdapter(adapter);

        }
    }

}

解决方案

at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
at com.---.---.MasterCat$TopFrag$TopTask.onPostExecute(MasterCat.java:570)

your TopTask.onPostExecute() must not touch the UI while the fragment is not yet (before onCreateView) / no longer (after onDestroyView) shown. There is simply no ListView you can get.

What you could do here is to update the datastructure that is used by the ListView so the next time the list is drawn the new data is included.

这篇关于&QUOT;内容视图尚未创建&QUOT;在Android碎片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆