这是我的代码:
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
TabHost tabHost = new TabHost(this);
TabHost.TabSpec tab = tabHost.newTabSpec("tab1");
tab.setIndicator("Tab 1");
tab.setContent(new TabHost.TabContentFactory() {
@Override
public View createTabContent(String tag) {
TextView tv = new TextView(Main.this);
tv.setText("tab 1 content");
return tv;
}
});
tabHost.addTab(tab);
setContentView(tabHost);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
[...]
07-13 20:26:49.261: ERROR/AndroidRuntime(625): Caused by: java.lang.NullPointerException
07-13 20:26:49.261: ERROR/AndroidRuntime(625): at android.widget.TabHost.addTab(TabHost.java:206)
07-13 20:26:49.261: ERROR/AndroidRuntime(625): at test.test.Main.onCreate(Main.java:27)
[...]
Run Code Online (Sandbox Code Playgroud)
我需要通过代码执行此操作,我不能使用XML.任何人都可以帮我解决这个问题吗?
好吧,我必须忽略一些愚蠢的东西,因为我无法让我的tabhost显示在我的Activity类中.当我尝试运行应用程序时,我正在接近可怕的力量.如果我扩展TabActivity,它会工作,但我不能这样做 [见下面的编辑],因为一旦我从我的原型项目中移动代码,它将在一个继承自Activity的自定义类中.
这是XML布局:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
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">
<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" />
</LinearLayout>
</TabHost>
Run Code Online (Sandbox Code Playgroud)
以下是尝试创建和显示TabHost的类:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TabHost;
public class my_proto extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
Log.i(this.toString(), "OnCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(this.toString(), "get tab host");
TabHost host = (TabHost)findViewById(R.id.tabhost);
host.setup();
Log.i(this.toString(), "add tabs");
host.addTab(host.newTabSpec("one")
.setIndicator("First Results")
.setContent(new …Run Code Online (Sandbox Code Playgroud) 我已经制作了一个应用程序,其中包含HelloTabActivity中的标签,这些标签之间也有空格,任何人都可以建议如何删除此空间,并且标签下方还有一条灰色线条如何删除?

main.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" >
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="none">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</HorizontalScrollView>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp" />
</LinearLayout>
</TabHost>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomTheme" parent="@android:style/Theme">
<item name="android:tabWidgetStyle">@style/CustomTabWidget</item>
</style>
<style name="CustomTabWidget" parent="@android:style/Widget.TabWidget">
<item name="android:textAppearance">@style/CustomTabWidgetText</item>
</style>
<style name="CustomTabWidgetText"
parent="@android:style/TextAppearance.Widget.TabWidget">
<item name="android:textSize">10sp</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">#1589FF</item>
<item name="android:padding">3dip</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)
活动
public class InfralineTabWidget extends TabActivity{
public void onCreate(Bundle savedInstanceState) { …Run Code Online (Sandbox Code Playgroud) android tabwidget android-layout android-style-tabhost android-tabhost
我的主要活动是TabActivity,但我的标签不需要图标.我知道我可以使用重载TabHost.TabSpec.setIndicator(CharSequence label)方法省略该图标,如本问题所述.
但是图标所在的空间仍然保留,因此浪费了大量空间.在这个问题中已经提到了这一点.看来我不能只降低标签高度.我必须提供我自己View的TabHost.TabSpec.setIndicator(View view)超载.
很好,但我想确保其余的样式(背景/着色)在所有设备上始终保持"android",就像我使用了默认的标签指示器一样.所以我不想提供自己的颜色.
我发现@android:color/tab_indicator_text并使用它TextView的文本颜色似乎按预期工作.但我不知道从哪里获得默认的tab-background-colors.我也发现了这种@android:style/Widget.TabWidget风格,但是它既不适用TextView也不适用于周围环境LinearLayout似乎有所帮助.
这是我的标签指示器视图xml文件,取自一些教程:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tabLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:padding="12dip" >
<TextView
android:id="@+id/tabText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/tab_indicator_text" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
如何获得"android默认"选项卡样式?
编辑:接下来,我尝试添加默认选项卡setIndicator(CharSequence),获取getBackground其指标视图的drawable,清除所有选项卡,添加我的自定义视图(见上文),然后将我检索到的drawable放入setBackground新指标.
结果看起来很正确,有点不对劲.首先,它们太高了,所以我什么都没得到.另一方面,所有选项卡的背景状态现在以某种方式链接(活动,突出显示,选择等).使用mutate()上绘制(S)没有帮助的.下一个技巧:我添加了三个默认选项卡,获取了所有背景,清除了它们,并给了我自己的三个选项卡,每个选项卡一个背景.
那么,这解决了第二个问题.他们的州不再联系在一起.但它们仍然太高了.所以我减少了TabWidget使用的高度updateViewLayout.这样可行,但在选项卡指示器的顶部留下变色条.
实际上,我最终会遇到与使用该TabHost.TabSpec.setIndicator(CharSequence label)方法时相同的情况.无论如何,所有这些黑客让我觉得很脏.是不是有一种优雅的方式来获得自定义视图上的默认android样式?
在我的项目中,我有两个选项卡和一个按钮.对于两个选项卡,我有两个活动和按钮调用不同的活动.事情是我在第一个标签上显示按钮的结果.即tab0在tab0Event和按钮点击事件上也处于活动状态.并且我能够使用tabHost.setOnTabChangedListener更改选项卡事件,但现在我还想要的是,假设我点击按钮所以现在按钮视图正在显示(tab0处于活动状态)但是再次如果我点击tab0,tab0活动应该是显示.
我尝试了许多点击标签的解决方案,一个是
getTabWidget().getChildAt(getTabHost().getCurrentTab()).setOnClickListener
(new View.OnClickListener() {
@Override public void onClick(View v) {
System.out.println(getTabHost().getCurrentTab());
} });
Run Code Online (Sandbox Code Playgroud)
但是当我使用tabChnageListner这个代码时,tab更改不起作用,我得到了非常意外的结果.你能为我的问题建议解决方案.
谢谢.
用于更改选项卡的代码如下所示:(对于标签更改工作正常,需要在其中添加Tab Onclick)
public class TabLayoutUsingTabChangeEventActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);
final TabHost.TabSpec sp1 = tabHost.newTabSpec("TAB1");
TabHost.TabSpec sp2 = tabHost.newTabSpec("TAB2");
//Creating First Tab
Intent intent1 = new Intent(this, Tab1Activity.class);
sp1.setIndicator("TAB1").setContent(intent1);
tabHost.addTab(sp1);
//Creating Second Tab
Intent intent2 = new Intent(this, Tab2Activity.class);
sp2.setIndicator("TAB2").setContent(intent2);
tabHost.addTab(sp2);
//Tab Changed Event
tabHost.setOnTabChangedListener(new OnTabChangeListener(){
@Override
public void onTabChanged(String tabId) { …Run Code Online (Sandbox Code Playgroud) 我目前有一个TabHost包含4个标签.在一些片段上,我们EditText在布局中有许多视图.
我们已经注意到,当您尝试EditText使用硬件键盘输入任何视图时,焦点将被从EditText当前活动的选项卡中删除并被赋予TabHost.这仅发生在带有标签的屏幕上.有没有一种快速简单的方法来解决这个问题?
我的片段中包含ViewPager的Tab(TabHost或TabContent)有一个奇怪的问题.
问题是,当我更改页面时,然后我回到带有tab和viewPager的片段,我的内容或视图消失了.
- >

这是TabFragment的代码
package com.halo.mobi.fragment;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabContentFactory;
import android.widget.TabWidget;
import android.widget.TextView;
import com.halo.mobi.R;
public class GameTabFragment extends Fragment {
Activity myActivity;
TabWidget tab;
TabHost tabHost;
ViewPager pager;
HorizontalScrollView hsvTab;
List<String> headers;
TabPagerAdapter adapter;
TabContentFactory fac;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated …Run Code Online (Sandbox Code Playgroud) 我有一个TabHostInside a navigationDrawer,我面临这个奇怪的问题,当我从其TabHost作为导航抽屉项目存在到另一个导航抽屉项目并且回到TabHost它将不会显示其内容,第一次它完美地工作时发生但是当我改变项目并回到它时,它将不会显示内容; 换句话说,它不会加载子片段,除非我关闭应用程序并重新启动它或更改方向(重新创建片段).
它是如何看起来我第一次打开它(含内容)

转到另一个navDrawer项并返回TabHost后

TabHost片段:
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TabHost;
import android.widget.TabWidget;
import java.util.ArrayList;
import info.fds.Emirates.R;
public class MyFragment extends Fragment
{
private TabHost mTabHost;
private ViewPager mViewPager;
private TabsAdapter mTabsAdapter;
public MyFragment() {
}
@Override
public void onCreate(Bundle instance)
{
super.onCreate(instance);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = …Run Code Online (Sandbox Code Playgroud) 我想创建在TabHost中使用的自定义按钮.我一直在尝试使用相同的图像资源(png),但是根据状态改变colorfilter.所以我把这个作为自定义按钮的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<ImageView android:id="@+id/tab_icon"
android:layout_centerInParent="true" android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView android:id="@+id/tab_text" android:layout_below="@id/tab_icon"
android:layout_centerHorizontal="true" android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
在我的活动中,我添加了这样的标签:
tabHost.addTab(tabHost.newTabSpec(TAB_NAME_NEWS).setIndicator(buildTab(R.drawable.tab_icon_news, R.string.news))
.setContent(newsIntent));
Run Code Online (Sandbox Code Playgroud)
这是'buildTab'方法:
private final static int[] SELECTED = new int[] { android.R.attr.state_selected };
private final static int[] IDLE = new int[] { -android.R.attr.state_selected };
private View buildTab(int icon, int label) {
LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.tab_button, null);
StateListDrawable drawable = new StateListDrawable();
Drawable selected = getResources().getDrawable(icon);
selected.mutate();
selected.setBounds(0, 0, selected.getIntrinsicWidth(), selected.getIntrinsicHeight()); …Run Code Online (Sandbox Code Playgroud) 应用程序的结构如下:
tabHost (in Activity) -> contains -> TabFragment(extend base container fragment)
Run Code Online (Sandbox Code Playgroud)
1.活动中的代码:
tabHost.addTab(
tabHost.newTabSpec("home").setIndicator("",
getResources().getDrawable(R.drawable.btn_home)),
HomeFragment.class, null);
Run Code Online (Sandbox Code Playgroud)
2. HomeFragment中的代码 (注意HomeFragment不是实际的函数,而是像这样的容器,它扩展了BaseContainerFragment):
public class HomeFragment extends BaseContainerFragment {
public Home homeFrag;
private boolean mIsViewInited;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.container_fragment, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (!mIsViewInited) {
mIsViewInited = true;
initView();
}
}
private void initView() {
homeFrag = new Home();
replaceFragment(homeFrag, false);
}
}
Run Code Online (Sandbox Code Playgroud)
3. BaseContainerFragment
public class BaseContainerFragment …Run Code Online (Sandbox Code Playgroud) android android-tabhost android-fragments android-activity onactivityresult
android ×10
android-tabhost ×10
fragment ×2
java ×2
tabs ×2
colorfilter ×1
keyboard ×1
tabwidget ×1