【问题标题】:ViewPager + spinners + array cause app to crashViewPager + spinners + array 导致应用程序崩溃
【发布时间】:2012-01-17 03:51:35
【问题描述】:

我的应用有两个单独的视图,它们最初是使用 TabHost 分开的。我决定改用 ViewPager 以使应用更具视觉吸引力。

但是现在应用程序一启动就崩溃了。现在,如果我注释掉有关微调器小部件和数组的所有行,那么一切都很好,但是对于我的生活,我无法弄清楚它们为什么会导致任何问题。他们在 TabHost 设置下工作得很好。

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//context.startService(serviceIntent);
startService(new Intent(this, MY_Service.class));

setContentView(R.layout.main);

    MyPagerAdapter adapter = new MyPagerAdapter();
    ViewPager myPager = (ViewPager) findViewById(R.id.wedgpager);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(0);
}

PagerAdapter 类:

live_view 只有一个按钮,该按钮在别处定义了 onClick 侦听器。

private class MyPagerAdapter extends PagerAdapter {

    public int getCount() {
            return 2;
    }

    public Object instantiateItem(View collection, int position) {

            LayoutInflater inflater = (LayoutInflater) collection.getContext()
                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            int resId = 0;
            switch (position) {
            case 0:
                    resId = R.layout.live_view;
                    break;
            case 1:
                    resId = R.layout.pod_view;

                    // Capture the textview elements
                    mCurrentDate = (TextView) findViewById(R.id.currentdateDisplay);
                    mSelectedDate = (TextView) findViewById(R.id.selecteddateDisplay);

                    TextTotalTime = (TextView) findViewById(R.id.TotalTimeText);
                    TextCurrentTime = (TextView) findViewById(R.id.CurrentTimeText);

                    // Retrieve the current date
                    Calendar c = Calendar.getInstance();
                    mYear = c.get(Calendar.YEAR);
                    mMonth = c.get(Calendar.MONTH);
                    mDay = c.get(Calendar.DAY_OF_MONTH);


                    Spinner datespinner = (Spinner) findViewById(R.id.spinnerdate);
                    ArrayAdapter<CharSequence> dateadapter = new ArrayAdapter<CharSequence>(app_Live.this, android.R.layout.simple_spinner_item);
                    dateadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

                    int ArrayMarker = 0;
                    for (int podtest = 1; podtest < 15; podtest++)  {
                        MakeDateList(podtest);
                        if (dayOfWeek != (1|7)) {
                            podFileTest = cMonthName + " " + cDay + ", " + cYear;
                            podDatesName[ArrayMarker] = podFileTest;
                            String cYearTemp = cYear + "";
                            String cMonthTemp = cMonth + "";
                            if (cMonth < 10) {
                                cMonthTemp = cMonthTemp.replace("0", "");
                                cMonthTemp = "0" + cMonthTemp;
                            }

                            if (cDay > 9)   {
                                podDates[ArrayMarker] = (cMonthTemp + "" + cDay + "" + cYearTemp.replace("20", ""));
                            }
                            if (cDay <= 9)  {
                                podDates[ArrayMarker] = (cMonthTemp + "" + "0" + cDay + "" + cYearTemp.replace("20", ""));
                            }
                            ArrayMarker++;

                            }
                        if (dayOfWeek == (1|7) && (ArrayMarker > 0))    {
                            ArrayMarker--;
                        }
                    }

                    for (int buildtext = 0; buildtext < 10; buildtext++)    {
                        dateadapter.add(podDatesName[buildtext]);
                    }

                   /* datespinner.setAdapter(dateadapter);

                    Spinner hourspinner = (Spinner) findViewById(R.id.spinnerhour);
                    ArrayAdapter<CharSequence> houradapter = ArrayAdapter.createFromResource(app_Live.this, R.array.hour_array, android.R.layout.simple_spinner_item);
                    houradapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    hourspinner.setAdapter(houradapter);

                     // Display the current date under "Today's Date" at the top
                    updateCurrentDate();
                    datespinner.setOnItemSelectedListener(new DateOnItemSelectedListener());
                    hourspinner.setOnItemSelectedListener(new HourOnItemSelectedListener());

                    Button podplaybutton = (Button)findViewById(R.id.button_pod_play);
                    //podplaybutton.setOnClickListener(this);*/

                    break;
            }

            View view = inflater.inflate(resId, null);
            ((ViewPager) collection).addView(view, 0);

            return view;
    }

这是 LogCat 的第一个错误:

01-16 22:13:24.279: W/dalvikvm(20182): threadid=1: 线程以未捕获的异常退出 (group=0x40a461f8) 01-16 22:13:24.384:E/AndroidRuntime(20182):致命异常:主要 01-16 22:13:24.384: E/AndroidRuntime(20182): android.content.res.Resources$NotFoundException: 资源 ID #0x0 01-16 22:13:24.384: E/AndroidRuntime(20182): 在 android.content.res.Resources.getValue(Resources.java:1019) 01-16 22:13:24.384: E/AndroidRuntime(20182): 在 android.content.res.Resources.loadXmlResourceParser(Resources.java:2107)

【问题讨论】:

  • order ...你应该先充气然后在充气视图而不是ViewPager上调用findViewById
  • 实际上,我尝试过(在另一篇文章中建议)然后我收到一个预编译错误,说“视图”尚未在“返回视图”行上启动。
  • 其实重读你的评论让我觉得我没有完全理解。不过我会试试看的。
  • 让我猜猜……你在switch声明之前添加了View view;? ...来吧,想一想,很明显...如果position不在您的“案例”中,则无法启动视图...因此将default:添加到switch并将视图设置为null或而不是View view; 在那里给视图空值(View view = null;)
  • mCurrentDate = (TextView) findViewById(R.id.currentdateDisplay); 这个 findViewById 是从 ViewPager 调用的,但你应该像这样调用view.findViewById,其中视图是View view = inflater.inflate(resId, null);,但它还不存在

标签: android arrays spinner android-arrayadapter android-viewpager


【解决方案1】:

好的,所以 Selvin 向我指出的答案是我没有把事情按正确的顺序排列。我需要在switch 语句之前启动View,然后我需要输入view.findViewById 而不是只调用findViewById

这是我现在正在运行的更新代码:(顺便说一句,如果有人知道一种更简洁的方式来编写从当天开始计算 14 天的那段代码,请随时告诉我)

private class MyPagerAdapter extends PagerAdapter {

public int getCount() {
        return 2;
}

public Object instantiateItem(View collection, int position) {

        LayoutInflater inflater = (LayoutInflater) collection.getContext()
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        int resId = 0;
        View view = null;

        switch (position) {
        case 0:
                resId = R.layout.live_view;
                view = inflater.inflate(resId, null);
                break;
        case 1:
                resId = R.layout.pod_view;
                view = inflater.inflate(resId, null);

                // Capture the textview elements
                mCurrentDate = (TextView) view.findViewById(R.id.currentdateDisplay);
                mSelectedDate = (TextView) view.findViewById(R.id.selecteddateDisplay);

                TextTotalTime = (TextView) view.findViewById(R.id.TotalTimeText);
                TextCurrentTime = (TextView) view.findViewById(R.id.CurrentTimeText);

                // Retrieve the current date
                Calendar c = Calendar.getInstance();
                mYear = c.get(Calendar.YEAR);
                mMonth = c.get(Calendar.MONTH);
                mDay = c.get(Calendar.DAY_OF_MONTH);


                Spinner datespinner = (Spinner) view.findViewById(R.id.spinnerdate);
                ArrayAdapter<CharSequence> dateadapter = new ArrayAdapter<CharSequence>(app_Live.this, android.R.layout.simple_spinner_item);
                dateadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

                int ArrayMarker = 0;
                for (int podtest = 1; podtest < 15; podtest++)  {
                    MakeDateList(podtest);
                    if (dayOfWeek != (1|7)) {
                        podFileTest = cMonthName + " " + cDay + ", " + cYear;
                        podDatesName[ArrayMarker] = podFileTest;
                        String cYearTemp = cYear + "";
                        String cMonthTemp = cMonth + "";
                        if (cMonth < 10) {
                            cMonthTemp = cMonthTemp.replace("0", "");
                            cMonthTemp = "0" + cMonthTemp;
                        }

                        if (cDay > 9)   {
                            podDates[ArrayMarker] = (cMonthTemp + "" + cDay + "" + cYearTemp.replace("20", ""));
                        }
                        if (cDay <= 9)  {
                            podDates[ArrayMarker] = (cMonthTemp + "" + "0" + cDay + "" + cYearTemp.replace("20", ""));
                        }
                        ArrayMarker++;

                    }
                    if (dayOfWeek == (1|7) && (ArrayMarker > 0))    {
                        ArrayMarker--;
                    }
                }

                for (int buildtext = 0; buildtext < 10; buildtext++)    {
                    dateadapter.add(podDatesName[buildtext]);
                }

                datespinner.setAdapter(dateadapter);

                Spinner hourspinner = (Spinner) view.findViewById(R.id.spinnerhour);
                ArrayAdapter<CharSequence> houradapter = ArrayAdapter.createFromResource(app_Live.this, R.array.hour_array, android.R.layout.simple_spinner_item);
                houradapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                hourspinner.setAdapter(houradapter);

                 // Display the current date under "Today's Date" at the top
                updateCurrentDate();
                datespinner.setOnItemSelectedListener(new DateOnItemSelectedListener());
                hourspinner.setOnItemSelectedListener(new HourOnItemSelectedListener());

                Button podplaybutton = (Button)findViewById(R.id.button_pod_play);
                //podplaybutton.setOnClickListener(this);*/

                break;
        }

        ((ViewPager) collection).addView(view, 0);

        return view;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2016-06-04
    • 2011-08-24
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多