• FragmentTabHost用法


    FragmentTabHost组成

    1. Tabhost,TabWidget,切换的内容容器FrameLayout
    2. 层级关系

      ----FragmentTabHost
          |-----TabWidget
          |-----FrameLayout
      

    布局实现

    1. 实现tabhost采用android.support.v4.app.FragmentTabHost

      注意 id:@android:id/tabhost

    2. 实现tabWidget

      注意 id:@android:id/tabs

    3. 实现FrameLayout

      注意

      1. id: @android:id/tabcontent

      2. 此容器已经被废除,但在布局中必须有

    4. 实现自定义的内容容器区域(FrameLayout)

      注意 :

      1. 整体需采用线性布局

      2. 将自定义展示的区域放到TabHost之上

      3. 自定义的内容需要给权重

    代码实现

    1. 初始化TabHost

      调用setup(Context,FragmentManager,int);

      最后一个参数 指的是 Fragment的容器id 用来切换fragment的

    2. 新建TabSpec

      调用setIndicator(View view)//实现自定义的tab

    3. 添加TabSpec

      调用addTab(TabSpec,Class,Bundle)的方法添加TabSpec

      Class 指的是 tab对应的 Fragment

      Bundle 指的是 Fragment 初始化的参数

    组合式控件的实现(下面的Tab一般都自定义)

    1. 新建布局
    2. 将布局和代码进行关联

      新建的View 必须继承 和 布局容器一样的容器类

      通过View.inflate(context,LayoutId, this)将View和xml进行绑定

    3. 功能进行封装

      根据当前View需要的功能进行封装

    布局:
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <FrameLayout
            android:id="@+id/activity_home_container"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1" >
        </FrameLayout>
        <android.support.v4.app.FragmentTabHost
            android:id="@android:id/tabhost"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:background="#FFF1F1F1" >
            </TabWidget>
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="0dp"
                android:layout_height="0dp" >
            </FrameLayout>
        </android.support.v4.app.FragmentTabHost>
    </LinearLayout>
    

      代码:

    public class HomeActivity extends BaseActivity implements OnTabChangeListener {
    	private static final String TAB_CHAT = "chat";
    	private static final String TAB_CONTACT = "contact";
    	private static final String TAB_DISCOVER = "discover";
    	private static final String TAB_ME = "me";
    	private FragmentTabHost tabhost;
    	private TabIndicatorView chatIndicator;
    	private TabIndicatorView contactIndicator;
    	private TabIndicatorView discoverIndicator;
    	private TabIndicatorView meIndicator;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.act_home);
    		// 1. 初始化TabHost
    		tabhost = (FragmentTabHost) findViewById(android.R.id.tabhost);
    		tabhost.setup(this, getSupportFragmentManager(),
    				R.id.activity_home_container);//上面的fargment
    		// 2. 新建TabSpec
    		TabSpec spec = tabhost.newTabSpec(TAB_CHAT);//需要自定义常量
    		chatIndicator = new TabIndicatorView(this);
    		chatIndicator.setTabTitle("消息");
    		chatIndicator.setTabIcon(R.drawable.tab_icon_chat_normal,
    				R.drawable.tab_icon_chat_focus);//选中和默认的图标
    		spec.setIndicator(chatIndicator);
    		// 3. 添加TabSpec
    		tabhost.addTab(spec, ChatFra.class, null);//添加上面的fargment
    		// 2. 新建TabSpec
    		spec = tabhost.newTabSpec(TAB_CONTACT);
    		contactIndicator = new TabIndicatorView(this);
    		contactIndicator.setTabIcon(R.drawable.tab_icon_contact_normal,
    				R.drawable.tab_icon_contact_focus);
    		contactIndicator.setTabTitle("通讯录");
    		contactIndicator.setTabUnreadCount(10);
    		spec.setIndicator(contactIndicator);
    		// 3. 添加TabSpec
    		tabhost.addTab(spec, ContactFra.class, null);
    		// 2. 新建TabSpec
    		spec = tabhost.newTabSpec(TAB_DISCOVER);
    		discoverIndicator = new TabIndicatorView(this);
    		discoverIndicator.setTabIcon(R.drawable.tab_icon_discover_normal,
    				R.drawable.tab_icon_discover_focus);
    		discoverIndicator.setTabTitle("发现");
    		discoverIndicator.setTabUnreadCount(10);
    		spec.setIndicator(discoverIndicator);
    		// 3. 添加TabSpec
    		tabhost.addTab(spec, DiscoverFra.class, null);
    		// 2. 新建TabSpec
    		spec = tabhost.newTabSpec(TAB_ME);
    		meIndicator = new TabIndicatorView(this);
    		meIndicator.setTabIcon(R.drawable.tab_icon_me_normal,
    				R.drawable.tab_icon_me_focus);
    		meIndicator.setTabTitle("我");
    		meIndicator.setTabUnreadCount(10);
    		spec.setIndicator(meIndicator);
    		// 3. 添加TabSpec
    		tabhost.addTab(spec, MeFra.class, null);
    		// 去掉分割线
    		tabhost.getTabWidget().setDividerDrawable(android.R.color.white);
    		// 初始化 tab选中
    		tabhost.setCurrentTabByTag(TAB_CHAT);
    		chatIndicator.setTabSelected(true);
    		// 设置tab切换的监听
    		tabhost.setOnTabChangedListener(this);
    	}
    	@Override
    	public void onTabChanged(String tag) {
    		chatIndicator.setTabSelected(false);
    		contactIndicator.setTabSelected(false);
    		discoverIndicator.setTabSelected(false);
    		meIndicator.setTabSelected(false);
    		if (TAB_CHAT.equals(tag)) {
    			chatIndicator.setTabSelected(true);
    		} else if (TAB_CONTACT.equals(tag)) {
    			contactIndicator.setTabSelected(true);
    		} else if (TAB_DISCOVER.equals(tag)) {
    			discoverIndicator.setTabSelected(true);
    		} else if (TAB_ME.equals(tag)) {
    			meIndicator.setTabSelected(true);
    		}
    	}
    }
    

      

    下面的自定义,动态的去添加信息

    public class TabIndicatorView extends RelativeLayout {
    	private ImageView ivTabIcon;
    	private TextView tvTabHint;
    	private TextView tvTabUnRead;
    	private int normalIconId;
    	private int focusIconId;
    	public TabIndicatorView(Context context) {
    		this(context, null);//这个实现这个构造函数就可以了
    	}
    	public TabIndicatorView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		// 将布局文件和 代码进行绑定
    		View.inflate(context, R.layout.tab_indicator, this);
    		ivTabIcon = (ImageView) findViewById(R.id.tab_indicator_icon);
    		tvTabHint = (TextView) findViewById(R.id.tab_indicator_hint);
    		tvTabUnRead = (TextView) findViewById(R.id.tab_indicator_unread);
    		
    		setTabUnreadCount(0);
    	}
    	// 设置tab的title
    	public void setTabTitle(String title) {
    		tvTabHint.setText(title);
    	}
    	public void setTabTitle(int titleId) {
    		tvTabHint.setText(titleId);
    	}
    	// 初始化图标
    	public void setTabIcon(int normalIconId, int focusIconId) {
    		this.normalIconId = normalIconId;
    		this.focusIconId = focusIconId;
    		ivTabIcon.setImageResource(normalIconId);
    	}
    	// 设置未读数
    	public void setTabUnreadCount(int unreadCount) {
    		if (unreadCount <= 0) {
    			tvTabUnRead.setVisibility(View.GONE);
    		} else {
    			if (unreadCount <= 99) {
    				tvTabUnRead.setText(unreadCount + "");
    			} else {
    				tvTabUnRead.setText("99+");
    			}
    			tvTabUnRead.setVisibility(View.VISIBLE);
    		}
    	}
    	// 设置选中
    	public void setTabSelected(boolean selected) {
    		if (selected) {
    			ivTabIcon.setImageResource(focusIconId);
    		} else {
    			ivTabIcon.setImageResource(normalIconId);
    		}
    	}
    }
    

      

  • 相关阅读:
    测试网站的响应性的工具
    取出分组后的前N条数据,笔记记录。
    纯js制作页码导航
    英语单复数转换类
    用鼠标滚动缩放图片
    Plugin 'InnoDB' init function returned error.Could not start the service MySQL 解决方法
    超时时间已到。在操作完成之前超时时间已过或服务器未响应。
    数据库关系图”提示:此数据库没有有效所有者(转载)
    关于非静态类的静态成员与非静态成员的初始化顺序(zhuang)
    项目经理的“势能”培养 (转)
  • 原文地址:https://www.cnblogs.com/sixrain/p/5107421.html
Copyright © 2020-2023  润新知