标签: android-tabhost

Android TabHost.addTab - >空指针异常

这是我的代码:

    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.任何人都可以帮我解决这个问题吗?

android nullpointerexception android-tabhost

12
推荐指数
2
解决办法
2万
查看次数

Android - Tabhost在Activity类中工作

好吧,我必须忽略一些愚蠢的东西,因为我无法让我的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)

android android-tabhost

11
推荐指数
3
解决办法
3万
查看次数

Android删除tabwidget中选项卡之间的空格

我已经制作了一个应用程序,其中包含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

11
推荐指数
2
解决办法
3万
查看次数

我可以在自定义标签视图中使用默认标签样式吗?

我的主要活动是TabActivity,但我的标签不需要图标.我知道我可以使用重载TabHost.TabSpec.setIndicator(CharSequence label)方法省略该图标,如本问题所述.

但是图标所在的空间仍然保留,因此浪费了大量空间.在这个问题中已经提到了这一点.看来我不能只降低标签高度.我必须提供我自己ViewTabHost.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样式?

tabs android android-tabhost

11
推荐指数
1
解决办法
8948
查看次数

如何为相同的选项卡调用选项卡Onclick和OnTabChange

在我的项目中,我有两个选项卡和一个按钮.对于两个选项卡,我有两个活动和按钮调用不同的活动.事情是我在第一个标签上显示按钮的结果.即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)

android android-tabhost android-tabactivity

11
推荐指数
2
解决办法
2万
查看次数

使用硬件键盘时,Android TabHost标签会窃取焦点

我目前有一个TabHost包含4个标签.在一些片段上,我们EditText在布局中有许多视图.

我们已经注意到,当您尝试EditText使用硬件键盘输入任何视图时,焦点将被从EditText当前活动的选项卡中删除并被赋予TabHost.这仅发生在带有标签的屏幕上.有没有一种快速简单的方法来解决这个问题?

keyboard tabs android android-tabhost

11
推荐指数
1
解决办法
3495
查看次数

标签内容在更改页面后消失

我的片段中包含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)

android fragment android-tabhost android-fragments

11
推荐指数
2
解决办法
4737
查看次数

TabHost一次显示内容(onCreate)

我有一个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)

java android fragment android-tabhost navigation-drawer

11
推荐指数
1
解决办法
456
查看次数

StateListDrawable用于切换colorfilters

我想创建在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)

java android android-layout android-tabhost colorfilter

10
推荐指数
3
解决办法
9247
查看次数

onActivityResult不在Fragment中调用

应用程序的结构如下:

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

10
推荐指数
4
解决办法
3万
查看次数