FragmentTabHost添加Activity

FramentTabHost可以在底部增加类似微信底部的按钮。但是现在有一个需求,点击其中一个按钮,需要显示4个圆形的按钮,并且背景是透明的。这样需要一个style是Dialog的Activity。如何才能做到呢,因为普通FragmentTabHost只能添加Fragment。

一、代码分析

我们先看普通的FragmentTabHost是如何添加一个tab的。

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);
再来看看FragmentTabHost中的addTab方法

public class FragmentTabHost extends TabHost {
 
    public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
        ...    
        addTab(tabSpec);
    }
 
}
再跟下Tabhost的addTab代码
public class TabHost extends FrameLayout {
  private TabWidget mTabWidget;
  public void addTab(TabSpec tabSpec) {
    ...
    View tabIndicator = tabSpec.mIndicatorStrategy.createIndicatorView();
    ...
    mTabWidget.addView(tabIndicator);
    ...
  }
}

addTab方法中调用了TabWidget的addView方法

public class TabWidget extends LinearLayout {
    @Override
    public void addView(View child) {
  ...
  super.addView(child);
  // TODO: detect this via geometry with a tabwidget listener rather
  // than potentially interfere with the view's listener
  child.setOnClickListener(new TabClickListener(getTabCount() - 1));
  child.setOnFocusChangeListener(this);
    }
}
在addView 方法中调用了父类的addView方法,最后调用setOnClickListener方法。

看到这里我们知道可以自己去设置setOnclickListener方法,

mTabHost.getTabWidget().getChildTabViewAt(0).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
 
    }
});

二、案例

下面我么再看下我们的代码

public class DetailActivity extends FragmentActivity {
	private String TAG = "DetailActivity";
	private FragmentTabHost mTabHost;
	private LayoutInflater layoutInflater;
	private String mMallId;
	private String mMallName;
	private String mSearchKey;
   
	private Class fragmentArray[] = { FragmentHome.class,
			FragmentShow.class, FragmentDown.class, FragmentUser.class,
			FragmentSetting.class }; 
     
	private int mImageViewArray[] = { R.drawable.home,
			R.drawable.show, R.drawable.discover_btn,
			R.drawable.map, R.drawable.user };
	private String mTextviewArray[] = { "主页", "秀吧", "发现", "用户", "设置" };	 
 
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.detail);
		Intent intent = getIntent();
		mMallId = intent.getStringExtra("mallId");
		mMallName = intent.getStringExtra("mallName");
		mSearchKey = intent.getStringExtra("searchKey");
                initView();
	}
 
	private void initView() {
        
		layoutInflater = LayoutInflater.from(this);
		mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
		mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
	
		int count = fragmentArray.length;

		for (int i = 0; i < count; i++) {
			TabSpec tabSpec = mTabHost.newTabSpec(mTextviewArray[i])
					.setIndicator(getTabItemView(i));
			mTabHost.addTab(tabSpec, fragmentArray[i], null);	
			/*mTabHost.getTabWidget().getChildAt(i)
					.setBackgroundResource(R.drawable.showbar_backgroud);*/
		} 
		mTabHost.getTabWidget().setBackgroundResource(R.drawable.showbar_backgroud);
		
        mTabHost.getTabWidget().getChildTabViewAt(2).setOnClickListener(new View.OnClickListener() {//第3个按钮,点击事件我们这边处理
            @Override
            public void onClick(View v) { 
	        	Intent intent = new Intent(DetailActivity.this, DiscoverWindow.class);
	        	startActivity(intent);
            }
        }); 
	}

	private View getTabItemView(int index) {
		View view = layoutInflater.inflate(R.layout.tab_item_view, null);
		ImageView imageView = (ImageView) view.findViewById(R.id.imageview);

		if (index == 2) {
			Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.discover_btn);
			Bitmap newBitmap = BitmapZoom.bitmapZoomByWidth(bitmap, getScreenWidth() / 8);
			imageView.setImageBitmap(newBitmap);
		} else {
			imageView.setImageResource(mImageViewArray[index]);
		} 

		return view;
	}
上面底部第三个按钮我们用自己的click事件处理,也就是不会到原生的Fragment中去了,而在我们的click事件处理中,我们startActivity。因此就实现了在FragmentTabHost中增加了一个Activity,而不是去进入另一个Fragment。这样前面一个Fragment就不会销毁,进入另一个Fragment。进入另一个Acitivity的话,可以把style变成Dialog,背景变成透明的可以实现了。





你可能感兴趣的:(FragmentTabHost添加Activity)