我目前正在开发一个应用程序并遇到了一个我可以修复的小错误,但我更想知道为什么我的错误会发生。我有一个选项卡式界面,使用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);
}
}
答案 0 :(得分:0)
听起来像是指向我的空指针...检查在方法第一次运行之前所有变量都已正确初始化。没有你的代码,很难说出实际上出了什么问题。