关于Android的ViewFlipper和第一次调用showNext()或showPrevious的一个非常奇怪的错误

时间:2011-12-16 20:02:39

标签: android viewflipper

我目前正在开发一个应用程序并遇到了一个我可以修复的小错误,但我更想知道为什么我的错误会发生。我有一个选项卡式界面,使用TabWidget创建三个选项卡。我的错误在于我放置了ViewFlipper的第一个选项卡。 ViewFlipper用于在两个不同的视图之间切换(使用两个ViewStub连接到两个先前设计的布局)。基本上第一个视图有一个按钮,当按下该按钮时,应将当前Tab中的ViewFlipper更改为下一个(或指定的)视图\ layout。现在,当应用程序第一次启动时,我的错误就出现了。对ViewFlipper(showNext或showPrevious或setDisplayChild)的第一个请求未注册。下一次按下(并按下此按钮)可正确更改显示。我已经使用LogCat检查了按钮是否实际调用了注册的onClick函数(在xml布局中定义),按钮确实注册了单击。问题再一次是对ViewFlipper视图的第一次调用改变,之后每次调用都能完美无缺。

非常感谢任何帮助。如果有必要,我愿意发布代码,但这是非常冗长的。

编辑:添加了代码。

主XML

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <ViewFlipper android:id="@+id/tab1"
                android:layout_width="fill_parent" 
                android:layout_height="fill_parent">

                <!-- View 1 -->
                <ViewStub android:id="@+id/stub1"
                   android:inflatedId="@+id/subTree1"
                   android:layout="@layout/layout_tab1"
                   android:layout_width="fill_parent"
                   android:layout_height="fill_parent" />

                <!-- View 2 -->
                <ViewStub android:id="@+id/stub2"
                   android:inflatedId="@+id/subTree2"
                   android:layout="@layout/layout_tab12" 
                   android:layout_width="fill_parent"
                   android:layout_height="fill_parent"/>
            </ViewFlipper>

            <ViewFlipper android:id="@+id/tab2"
                android:layout_width="fill_parent" android:layout_height="fill_parent">

                <!-- View 1 -->
                <ViewStub android:id="@+id/stub3"
                   android:inflatedId="@+id/subTree3"
                   android:layout="@layout/layout_tab2"
                   android:layout_width="fill_parent"
                   android:layout_height="fill_parent" />

            </ViewFlipper>    
            <ViewFlipper android:id="@+id/tab3"
                android:layout_width="fill_parent" android:layout_height="fill_parent">

                <!-- View 1 -->
                <ViewStub android:id="@+id/stub4"
                   android:inflatedId="@+id/subTree4"
                   android:layout="@layout/layout_tab3"
                   android:layout_width="fill_parent"
                   android:layout_height="fill_parent" />

                <!-- View 2 -->
            </ViewFlipper>         
        </FrameLayout>
    </LinearLayout>
</TabHost>

标签1 XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tabone"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" 
        android:onClick="onButtonClick"/>

            <TextView 
                android:id="@+id/textview1"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" 
                android:text="Tab 1" />
</LinearLayout>

申请代码

    TabHost mTabHost;
    TextView textCurrent;
    ViewFlipper viewFlipper;
    String tag = "Tag";
    int value = 0;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mTabHost = getTabHost();

        mTabHost.addTab(mTabHost.newTabSpec("tab_test1").setIndicator("TAB 1").setContent(R.id.tab1));
        mTabHost.addTab(mTabHost.newTabSpec("tab_test2").setIndicator("TAB 2").setContent(R.id.tab2));
        mTabHost.addTab(mTabHost.newTabSpec("tab_test3").setIndicator("TAB 3").setContent(R.id.tab3));

        mTabHost.setCurrentTab(0);

        mTabHost.setOnTabChangedListener(this);

    }

    public void onButtonClick(View v)
    {
        if(v.getId() == R.id.button1)
        {
            Log.d(tag, "Button Pressed");
            viewFlipper = (ViewFlipper) findViewById(R.id.tab1);
            viewFlipper.showNext();

            /*
            //HACK TO GET NEXT BUTTON WORKING
            value++;
            if(value == 1)
             viewFlipper.showNext();
             */
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) { //Back key pressed
            mTabHost = getTabHost();
            if(mTabHost.getCurrentTab() == 0)
            {
                //Things to Do
                viewFlipper = (ViewFlipper) findViewById(R.id.tab1);
                viewFlipper.showPrevious();
            }
            else
            {
                finish();
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    public void onTabChanged(String arg0) {
        // TODO Auto-generated method stub
        if(arg0.equals("tab_test1"))
        {
            Log.d(tag, "Tab 1 Accessed");
            viewFlipper = (ViewFlipper) findViewById(R.id.tab1);
            int index = viewFlipper.indexOfChild(findViewById(R.id.subTree1));
            viewFlipper.setDisplayedChild(index);   
        }
    }

1 个答案:

答案 0 :(得分:0)

听起来像是指向我的空指针...检查在方法第一次运行之前所有变量都已正确初始化。没有你的代码,很难说出实际上出了什么问题。