Очень странная ошибка в отношении Android ViewFlipper и первого вызова showNext () или showPrevious - PullRequest
1 голос
/ 17 декабря 2011

Я в настоящее время разрабатываю приложение и столкнулся с небольшой ошибкой, которую я могу исправить, но я бы предпочел знать, почему возникает моя ошибка. У меня есть интерфейс с вкладками, который использует TabWidget для создания трех вкладок. Моя ошибка лежит в первой вкладке, где я поместил ViewFlipper. ViewFlipper предназначен для переключения между двумя различными видами (используя два ViewStub для подключения к двум ранее разработанным макетам). В основном в первом представлении есть кнопка, которая при нажатии должна заменить 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 голосов
/ 17 декабря 2011

Звучит как нулевой указатель на меня ... проверьте, что все переменные правильно инициализированы, прежде чем метод запустится в первый раз. Трудно сказать, что на самом деле происходит без вашего кода.

...