码迷,mamicode.com
首页 > 其他好文 > 详细

仿oschina 主界面的实现(一) -------FragmentTabHost+Fragment

时间:2015-08-11 12:15:25      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

FragmentTabHost+Fragment

官网的API dome
Special TabHost that allows the use of Fragment objects for its tab content. When placing this in a view hierarchy, after inflating the hierarchy you must call setup(Context, FragmentManager, int) to complete the initialization of the tab host.

import com.example.android.supportv4.R;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTabHost;

/**
 * This demonstrates how you can implement switching between the tabs of a
 * TabHost through fragments, using FragmentTabHost.
 */
public class FragmentTabs extends FragmentActivity {
    private FragmentTabHost mTabHost;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_tabs);
        mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

        mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
                FragmentStackSupport.CountingFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
                LoaderCursorSupport.CursorLoaderListFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"),
                LoaderCustomSupport.AppListFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("throttle").setIndicator("Throttle"),
                LoaderThrottleSupport.ThrottledLoaderListFragment.class, null);
    }
}

This can also be used inside of a fragment through fragment nesting:
import com.example.android.supportv4.R;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTabHost;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FragmentTabsFragmentSupport extends Fragment {
    private FragmentTabHost mTabHost;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mTabHost = new FragmentTabHost(getActivity());
        mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.fragment1);

        mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
                FragmentStackSupport.CountingFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
                LoaderCursorSupport.CursorLoaderListFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"),
                LoaderCustomSupport.AppListFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("throttle").setIndicator("Throttle"),
                LoaderThrottleSupport.ThrottledLoaderListFragment.class, null);

        return mTabHost;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mTabHost = null;
    }
}
常用的方法
Public Methods
void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args)
void onTabChanged(String tabId)
void setOnTabChangedListener(TabHost.OnTabChangeListener l)
Register a callback to be invoked when the selected state of any of the items in this list changes
void setup()
This method is deprecated. Don‘t call the original TabHost setup, you must instead call setup(Context, FragmentManager) or setup(Context, FragmentManager, int).
void setup(Context context, FragmentManager manager)
void setup(Context context, FragmentManager manager, int containerId)
效果图
技术分享

main_tab_explore:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/widget_bar_explore_over" android:state_selected="true"></item>
    <item android:drawable="@drawable/widget_bar_explore_nor" ></item>
</selector>

activity_main:

<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"
    tools:context="com.skyfin.oschina.MainActivity" >

    <FrameLayout
        android:id="@+id/realtabcontent"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" />

    <com.skyfin.oschina.MyFragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:background="@color/Fragment_tab_bg">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />            
    </com.skyfin.oschina.MyFragmentTabHost>

</LinearLayout>


MainActivity
package com.skyfin.oschina;

import android.R.string;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTabHost;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.Toast;
import android.widget.TabHost.TabSpec;
import android.widget.TextView;
import android.widget.TabHost.TabContentFactory;

public class MainActivity extends FragmentActivity {

	String old_tag;
	private MyFragmentTabHost mTabHost;
	
	private LayoutInflater layoutInflater;
	
	private View fragmentQuickoption;
	
	private Class fragmentArray[] = {FragmentNews.class,
			FragmentTweet.class,FragmentQuickoption.class,
			FragmentExplore.class,FragmentMe.class};
	
	private int mImageArray[] = {R.drawable.main_tab_news,
			R.drawable.main_tab_tweet,R.drawable.main_tab_quickoption,
			R.drawable.main_tab_explore,R.drawable.main_tab_me};
	
	private String mTextArray[]={
			"综合","动弹","添加","发现","我"
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
	}
	
	private void initView(){
	    
		// 实例化布局对象
        layoutInflater = LayoutInflater.from(this);

        // 实例化TabHost对象,得到TabHost
        mTabHost = (MyFragmentTabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
        
        // 得到fragment的个数
        int count = fragmentArray.length;

        
        for (int i = 0; i < count; i++) {
        	//View indicator = LayoutInflater.from(getApplicationContext()).inflate(R.layout.tab_item_btn_view, null);
            // 为每一个Tab按钮设置图标、文字和内容
            TabSpec tabSpec = mTabHost.newTabSpec(mTextArray[i])
                    .setIndicator(getTabItemView(i));
            // 将Tab按钮添加进Tab选项卡中
            if(i == 2)
            {
            	//indicator.setVisibility(View.INVISIBLE);
            	mTabHost.setNoTabChangedTag(mTextArray[i]);
            }
            //tabSpec.setIndicator(indicator);
            /*tabSpec.setContent(new TabContentFactory(){

				@Override
				public View createTabContent(String tag) {
					// TODO Auto-generated method stub
					return null;
				}
            	
            });*/
            mTabHost.addTab(tabSpec, fragmentArray[i], null);
            // 设置Tab按钮的背景
            mTabHost.getTabWidget().getChildAt(i)
                    .setBackgroundResource(R.color.Fragment_tab_bg);
            //去掉竖线
            mTabHost.getTabWidget().setDividerDrawable(null);
        }
        //设置按钮的监听
        mTabHost.setOnTabChangedListener(new OnTabChangedListener());
		
	}
	/**
	 * 按钮的监听的类
	 * @author Skyfin
	 *
	 */
	class OnTabChangedListener implements OnTabChangeListener {

		@Override
		public void onTabChanged(String tabId) {
			// TODO Auto-generated method stub
			//Toast.makeText(getApplication(), tabId,Toast.LENGTH_SHORT).show();
			if (old_tag != tabId) {
				Toast.makeText(getApplicationContext(), tabId, Toast.LENGTH_SHORT).show();
			}else{
				Toast.makeText(getApplicationContext(), "添加", Toast.LENGTH_SHORT).show();
			}
			old_tag = tabId;
			
		}
		
	}
	  /**
     * 给Tab按钮设置图标和文字
     */
    private View getTabItemView(int index) {
        View view = layoutInflater.inflate(R.layout.tab_item_view, null);

        if(index != 2){
        ImageView imageView = (ImageView) view.findViewById(R.id.imageview);
        imageView.setImageResource(mImageArray[index]);

        TextView textView = (TextView) view.findViewById(R.id.textview);
        textView.setText(mTextArray[index]);
        }else {
        	view = layoutInflater.inflate(R.layout.tab_item_btn_view, null);
        	ImageView imageView = (ImageView) view.findViewById(R.id.imageview);
        	imageView.setImageResource(mImageArray[index]);
		}
        return view;
    }
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}

MyFragmentTabHost
package com.skyfin.oschina;

import android.content.Context;
import android.support.v4.app.FragmentTabHost;
import android.util.AttributeSet;


public class MyFragmentTabHost extends FragmentTabHost {
	
	private String mCurrentTag;
	
	private String mNoTabChangedTag;
	
	public MyFragmentTabHost(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	@Override
	public void onTabChanged(String tag) {
		
		if (tag.equals(mNoTabChangedTag)) {
			setCurrentTabByTag(mCurrentTag);
		} else {
			super.onTabChanged(tag);
			mCurrentTag = tag;
		}
	}
	
	public void setNoTabChangedTag(String tag) {
		this.mNoTabChangedTag = tag;
	}
}
Fragment:
package com.skyfin.oschina;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FragmentNews extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_news, container, false);
	}
}


代码下载:http://download.csdn.net/detail/u012938203/8989689

版权声明:本文为博主原创文章,未经博主允许不得转载。

仿oschina 主界面的实现(一) -------FragmentTabHost+Fragment

标签:

原文地址:http://blog.csdn.net/u012938203/article/details/47414173

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!