使用按钮在标签之间切换

时间:2012-01-04 13:01:45

标签: android

有谁知道如何创建一个可以帮助我在标签之间切换的按钮?

Button button1 = (Button) findViewById(R.id.button1);    
    button1.setOnClickListener(new OnClickListener() {  
        public void onClick(View v) {{
            // Perform action on click   
                if (v.getId() == R.id.button1) {
                    setContentView(R.layout.tab3);    
                }
                else if (v.getId() == R.id.button1) {
                    setContentView(R.layout.main);  
                }
            }
        }
    });
}}

这是我的标签1中的代码,下一个代码是我的tab.xml中的按钮。我想按下面的购买按钮,我希望它转到另一个标签,这可能吗?

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@+id/imageButton1"
        android:text="Buy"  
        android:onClick="tab3" />

这是我的logcat文件

01-05 16:04:20.903: D/dalvikvm(215): GC freed 806 objects / 70928 bytes in 96ms
01-05 15:30:29.072: D/AndroidRuntime(213): Shutting down VM
01-05 15:30:29.082: W/dalvikvm(213): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
01-05 15:30:29.082: E/AndroidRuntime(213): Uncaught handler: thread main exiting due to uncaught exception
01-05 15:30:29.132: E/AndroidRuntime(213): java.lang.IllegalStateException: Could not find a method tab3(View) in the activity
01-05 15:30:29.132: E/AndroidRuntime(213):  at android.view.View$1.onClick(View.java:2020)
01-05 15:30:29.132: E/AndroidRuntime(213):  at android.view.View.performClick(View.java:2364)
01-05 15:30:29.132: E/AndroidRuntime(213):  at android.view.View.onTouchEvent(View.java:4179)
01-05 15:30:29.132: E/AndroidRuntime(213):  at android.widget.TextView.onTouchEvent(TextView.java:6541)
01-05 15:30:29.132: E/AndroidRuntime(213):  at android.view.View.dispatchTouchEvent(View.java:3709)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-05 16:04:25.693: E/AndroidRuntime(215):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
01-05 16:04:25.693: E/AndroidRuntime(215):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
01-05 16:04:25.693: E/AndroidRuntime(215):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.os.Looper.loop(Looper.java:123)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.app.ActivityThread.main(ActivityThread.java:4363)
01-05 16:04:25.693: E/AndroidRuntime(215):  at java.lang.reflect.Method.invokeNative(Native Method)
01-05 16:04:25.693: E/AndroidRuntime(215):  at java.lang.reflect.Method.invoke(Method.java:521)
01-05 16:04:25.693: E/AndroidRuntime(215):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
01-05 16:04:25.693: E/AndroidRuntime(215):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
01-05 16:04:25.693: E/AndroidRuntime(215):  at dalvik.system.NativeStart.main(Native Method)
01-05 16:04:25.693: E/AndroidRuntime(215): Caused by: java.lang.NoSuchMethodException: Tab3
01-05 16:04:25.693: E/AndroidRuntime(215):  at java.lang.ClassCache.findMethodByName(ClassCache.java:308)
01-05 16:04:25.693: E/AndroidRuntime(215):  at java.lang.Class.getMethod(Class.java:1014)
01-05 16:04:25.693: E/AndroidRuntime(215):  at android.view.View$1.onClick(View.java:2017)
01-05 16:04:25.693: E/AndroidRuntime(215):  ... 25 more
01-05 16:04:25.733: I/dalvikvm(215): threadid=7: reacting to signal 3
01-05 16:04:25.733: I/dalvikvm(215): Wrote stack trace to '/data/anr/traces.txt'
01-05 16:04:27.505: I/Process(215): Sending signal. PID: 215 SIG: 9

3 个答案:

答案 0 :(得分:5)

+1 Midoalageb和+1 Mark Gjol为您提供了切换标签所需的确切内容。他们遗漏的是你要做的事件的代码。您需要做的是在TAB1上设置一个按钮,该按钮会有一个onClick()听众,可以调用getTabHost().setCurrentTabByTag(TAB2);getTabHost().setCurrentTab(1);。其中任何一个都可以正常工作,只取决于你想要的方式。

你知道如何做按钮和onClick()听众吗?如果没有,谷歌有一些很好的例子。只需在tabView中创建一个按钮,然后设置onClick,然后将代码放在那里以切换到所需的选项卡。

Another post非常类似于可以帮助你的那个。


getTabHost()setCurrentTabByTag(TAB2);

这将查找标有“TAB2”的标签并更改为该标签。


getTabHost()setCurrentTab(1);

这将查找索引为“1”的选项卡并更改为该选项卡。


关于您的xml

xml文件主要用于从Views的实现中抽象定义Views。这允许您或其他开发人员在需要时为您的代码提供不同的视图。它有助于提供使用MVC模式的方法。但是,这种模式在Android中略有不同,但xml文件通常被认为是该模式中的视图。

是的,如果您要使用多个按钮,则需要在xml中定义并在代码中实现。


关于你的按钮困境

API for Button from google实际上在最前面的页面上提供了一个示例。请记住,Android作为一个开发平台已经非常成熟,而且很多这样的东西实际上已经在线记录。 API文档也非常好,并提供了很好的示例。去那里看看它,你很可能会解决很多那里容易出问题的问题。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView textview = new TextView(this);
    textview.setText("This is Tab1");
    setContentView(textview);

    final Button button = (Button) findViewById(R.id.button1);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // Perform action on click
            // perform the switch to tab event here for instance...
            getTabHost().setCurrentTabByTag("TAB2");
        }
    });
}

答案 1 :(得分:3)

当你创建标签时,你给它们一个标签,让我们在变量TAB_1中存储一个这样的标签。因此,在onClick()方法中,您可以通过以下方式选择该标签:

getTabHost().setCurrentTabByTag(TAB_1);

或者,正如midoalageb所写,通过索引:

getTabHost().setCurrentTab(index);

答案 2 :(得分:2)

以下是Tab example的解释:

创建主活动:

public class HelloTabWidget extends TabActivity

为每个标签创建一个活动:

public class ArtistsActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView textview = new TextView(this);
        textview.setText("This is the Artists tab");
        setContentView(textview); // you replace this with your layout for each view
    }
}

在主Activity(HelloTabWidget)中,启动TabHost:

TabHost tabHost = getTabHost();

为每个标签添加TabSpecs:

intent = new Intent().setClass(this, ArtistsActivity.class);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = tabHost.newTabSpec("artists").setIndicator("Artists",
                  res.getDrawable(R.drawable.ic_tab_artists))
              .setContent(intent);
tabHost.addTab(spec);

选择您需要哪个标签:

tabHost.setCurrentTab(int index);

最后你的Button的onClickListener应该在包含Button的Tab的Activity中设置为:

intent = new Intent().setClass(this, ArtistsActivity.class);
startActivity(intent);

如果您希望它在它们之间切换,则此按钮应出现在所有标签中。