gpt4 book ai didi

LinearLayout 内的 android TabHost

转载 作者:行者123 更新时间:2023-11-29 14:54:17 24 4
gpt4 key购买 nike

在寻找解决方案后我决定重新提出一个问题already asked here .

我有一个 TabHost 控件,我需要将它放在其他布局 (LinearLayout) 中。我收起谷歌给我们的例子(http://developer.android.com/resources/tutorials/views/hello-tabwidget.html)并做了同样的事情,唯一的区别是 TabHost 不是布局的根并且显示 View 的 Activity 类不扩展 TabActivity,而是 Activity

我的 xml 是这样的:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabHost android:id="@+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"
android:padding="5dp">
<TabWidget android:id="@android:id/tabs"
android:layout_width="fill_parent" android:layout_height="53px"
android:tabStripEnabled="false" android:layout_margin="1px"
android:background="#222222" />
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:padding="5dp" />
</LinearLayout>
</TabHost>
</LinearLayout>

Java 类是这样的:

public class TabsExampleActivity extends Activity {

TabHost tabHost;


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

initTabs();

}


private void initTabs() {
Resources res = getResources(); // Resource object to get Drawables
tabHost = (TabHost) findViewById(R.id.tabhost); // The activity TabHost

TabHost.TabSpec spec; // Resusable TabSpec for each tab
Intent intent; // Reusable Intent for each tab

intent = new Intent("eu.pkg.tabsExample.BuildingTabActivity");
spec = tabHost.newTabSpec("text").setIndicator("",
res.getDrawable(R.drawable.tab_text_selector))
.setContent(intent);
tabHost.addTab(spec);

intent = new Intent().setClass(this, ClipArtTabActivity.class);
spec = tabHost.newTabSpec("clipart").setIndicator("",
res.getDrawable(R.drawable.tab_clipart_selector))
.setContent(intent);
tabHost.addTab(spec);


intent = new Intent().setClass(this, FrameSelectorTabActivity.class);
spec = tabHost.newTabSpec("frame").setIndicator("",
res.getDrawable(R.drawable.tab_frame_selector))
.setContent(intent);
tabHost.addTab(spec);



intent = new Intent().setClass(this, BgSelectorTabActivity.class);
spec = tabHost.newTabSpec("bg").setIndicator("",
res.getDrawable(R.drawable.tab_bg_selector))
.setContent(intent);
tabHost.addTab(spec);

intent = new Intent().setClass(this, BuildingTabActivity.class);
spec = tabHost.newTabSpec("build").setIndicator("",
res.getDrawable(R.drawable.tab_build_selector))
.setContent(intent);
tabHost.addTab(spec);

tabHost.setCurrentTab(4);
}
}

如果我将 TabActivity 用作基本 Activity ,并将 TabHost 用作根,那么代码运行良好,我看到选项卡...等等。

只有当我扩展 Activity 并且错误是:

04-11 18:53:38.874: ERROR/AndroidRuntime(32539): java.lang.RuntimeException: Unable to start activity ComponentInfo{eu.pkg.tabsExample/eu.pkg.tabsExample.TabsExampleActivity}: java.lang.NullPointerException

问题是:如何在 LinearLayout 中托管 TabHost

编辑:

按照评论中的建议进行更改后,log cat 错误为:

04-11 20:52:01.993: ERROR/imdg81(28747): IsShutDownStarted() 04-11 20:52:01.999: ERROR/SensorManager(28747): registerListener 4:gp2a Light Sensor delay:240 04-11 20:52:01.999: ERROR/SensorManager(28747): =======>>>Sensor Thread RUNNING <<<======== 04-11 20:52:02.075: ERROR/imdg81(28747): IsShutDownStarted() 04-11 20:52:02.284: ERROR/LockPatternKeyguardView(28747): Phone is boot completed. so can send broadcast message for music player 04-11 20:52:05.507: ERROR/jdwp(3675): Failed writing handshake bytes: Broken pipe (-1 of 14) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): FATAL EXCEPTION: main 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): java.lang.RuntimeException: Unable to start activity ComponentInfo{eu.pkg.tabsExample/eu.pkg.tabsExample.TabsExampleActivity}: java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'? 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.os.Handler.dispatchMessage(Handler.java:99) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.os.Looper.loop(Looper.java:123) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.app.ActivityThread.main(ActivityThread.java:4627) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at java.lang.reflect.Method.invokeNative(Native Method) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at java.lang.reflect.Method.invoke(Method.java:521) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at dalvik.system.NativeStart.main(Native Method) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): Caused by: java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'? 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.widget.TabHost.setCurrentTab(TabHost.java:328) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.widget.TabHost.addTab(TabHost.java:213) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at eu.pkg.tabsExample.TabsExampleActivity.initTabs(TabsExampleActivity.java:43) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at eu.pkg.tabsExample.TabsExampleActivity.onCreate(TabsExampleActivity.java:27) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 04-11 20:52:05.609: ERROR/AndroidRuntime(3675): ... 11 more

最佳答案

问题解决了。正确的解决方案,如用户 207 在评论之一中给出的,来自另一个 stackoverflow 问题是这样的:

这是 XML:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabHost 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"
android:padding="5dp">
<TabWidget android:id="@android:id/tabs"
android:layout_width="fill_parent" android:layout_height="53px"
android:tabStripEnabled="false" android:layout_margin="1px"
android:background="#222222" />
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:padding="5dp" />
</LinearLayout>
</TabHost>
</LinearLayout>

和java文件:

package eu.pkg.tabsExample;

import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TabHost;

public class TabsExampleActivity extends Activity {

TabHost tabHost;
LocalActivityManager mLocalActivityManager;

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

initTabs(savedInstanceState);
}

@Override
protected void onResume() {
mLocalActivityManager.dispatchResume();
super.onResume();
}

@Override
protected void onPause() {
mLocalActivityManager.dispatchPause(isFinishing());
super.onPause();
}

private void initTabs(Bundle savedInstanceState) {
Resources res = getResources(); // Resource object to get Drawables
tabHost = (TabHost) findViewById(android.R.id.tabhost); // The activity TabHost
mLocalActivityManager = new LocalActivityManager(this, false);
mLocalActivityManager.dispatchCreate(savedInstanceState);
tabHost.setup(mLocalActivityManager);

TabHost.TabSpec spec; // Resusable TabSpec for each tab
Intent intent; // Reusable Intent for each tab

intent = new Intent("eu.pkg.tabsExample.BuildingTabActivity");
spec = tabHost.newTabSpec("text").setIndicator("",
res.getDrawable(R.drawable.tab_text_selector))
.setContent(intent);
tabHost.addTab(spec);

intent = new Intent().setClass(this, ClipArtTabActivity.class);
spec = tabHost.newTabSpec("clipart").setIndicator("",
res.getDrawable(R.drawable.tab_clipart_selector))
.setContent(intent);
tabHost.addTab(spec);


intent = new Intent().setClass(this, FrameSelectorTabActivity.class);
spec = tabHost.newTabSpec("frame").setIndicator("",
res.getDrawable(R.drawable.tab_frame_selector))
.setContent(intent);
tabHost.addTab(spec);



intent = new Intent().setClass(this, BgSelectorTabActivity.class);
spec = tabHost.newTabSpec("bg").setIndicator("",
res.getDrawable(R.drawable.tab_bg_selector))
.setContent(intent);
tabHost.addTab(spec);

intent = new Intent().setClass(this, BuildingTabActivity.class);
spec = tabHost.newTabSpec("build").setIndicator("",
res.getDrawable(R.drawable.tab_build_selector))
.setContent(intent);
tabHost.addTab(spec);

tabHost.setCurrentTab(4);
}
}

幕后的魔力在于那 4 行代码:

    tabHost = (TabHost) findViewById(android.R.id.tabhost);     // The activity TabHost
mLocalActivityManager = new LocalActivityManager(this, false);
mLocalActivityManager.dispatchCreate(savedInstanceState);
tabHost.setup(mLocalActivityManager);

感谢大家对这个答案的贡献。

关于LinearLayout 内的 android TabHost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10109547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com