关于这个,其实我以前做过,但是又忘记了,然后找网上的DEMO,发现不尽如意,然后找了一下以前的DEMO,发现我保存下来了。
看来以后要勤写博客,牢记那些以前用过的东西。
接下来进入正题:
动态fragment的使用
对于动态的使用fragment,就是简单的底部多个按钮,然后多个fragment 进行切换,这个应该很简单,平时都在用。
MainActivity:
/**
* 主布局
* @author Rine
* @version 1.0, 2015-12-1
*/
public class MainActivity extends FragmentActivity{
MainDB mdata = new MainDB();
/**
* 定义结束时间
*/
private long exitTime = 0;
/**
* 定义FragmentTabHost对象
*/
private FragmentTabHost mTabHost;
/**
* 定义一个布局
*/
private LayoutInflater layoutInflater;
/**
* 定义数组来存放Fragment界面
*/
private Class fragmentArray[] = mdata.fragmentArray;
/**
* 定义数组来存放按钮图片
*/
private int mImageViewArray[] = mdata.ImageViewArray;
/**
* Tab选项卡的文字
*/
private String mTextviewArray[] = mdata.TextviewArray;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// CloudOnlyDB dbHelper;
// dbHelper = new CloudOnlyDB(MainActivity.this);
// HomeData home = new HomeData(MainActivity.this);
initView( );
}
/**
* 初始化组件
*/
private void initView (){
/**
* 实例化布局对象
*/
layoutInflater = LayoutInflater.from(this);
/**
* 实例化TabHost对象,得到TabHost
*/
mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
mTabHost.setup(this, getSupportFragmentManager(), R.id.container); //加载内容
/**
* 得到fragment的个数
*/
int count = fragmentArray.length;
for(int i = 0; i < count; i++){
TabSpec tabSpec = mTabHost.newTabSpec(mTextviewArray[i]).setIndicator(getTabItemView(i)); //为每一个Tab按钮设置图标、文字和内容
mTabHost.addTab(tabSpec, fragmentArray[i], null); //将Tab按钮添加进Tab选项卡中
}
}
/**
* 给Tab按钮设置图标和文字
*/
private View getTabItemView(int index){
View view = layoutInflater.inflate(R.layout.main_tab_view, null);
ImageView imageView = (ImageView) view.findViewById(R.id.imageview);
imageView.setImageResource(mImageViewArray[index]);
TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(mTextviewArray[index]);
return view;
}
/**
* 2次退出效果
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
exit(); //按返回键,true则退出
return false;
}
return super.onKeyDown(keyCode, event);
}
public void exit() { //按返回退出
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else { //退出
finish();
System.exit(0);
}
}
}
MainAcitivity 中的MainDB
/**
* 存放主布局数据
* @author Rine
* @version 1.0, 2015-12-1
*/
public class MainDB {
/**
* 定义数组来存放Fragment界面
*/
public Class fragmentArray[] = {one.class,two.class,three.class};
/**
* 定义数组来存放按钮图片
*/
public int ImageViewArray[] = {R.drawable.home,R.drawable.ccarticle,
R.drawable.ccone};
/**
* Tab选项卡的文字
*/
public String TextviewArray[] = {"one","twom","three"};
}
MainActivity 相应的布局:
<?xml version="1.0" encoding="utf-8"?>
<!-- Rine -->
<!-- 功能:主布局 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<android.support.v4.app.FragmentTabHost
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0" />
</android.support.v4.app.FragmentTabHost>
</LinearLayout>
相应的style:
<style name="homework_tab_item">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_weight">1</item>
<item name="android:button">@null</item>
<item name="android:gravity">center</item>
<item name="android:textColor">@color/homework_tab_item_text_color</item>
</style>
相应的 color:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:color="#000000"/>
<item android:color="#757575"/>
</selector>
fragment嵌套fragment
这就是简单动态fragment的应该。这也是其中的一种方法。
然后就是在其fragment中再嵌套多个fragment,我采用的是利用单选按钮来实现,当然单选按钮外面还要包一层RadioGroup。
Activity:
/**
* fragment嵌套fragment
* @author Rine
* @version 1.0, 2015-12-1
*/
public class two extends Fragment implements OnClickListener
{
/**
* 定义一个布局
*/
private LayoutInflater inflater;
// private View rootView;// 缓存Fragment view
private Context mainActivity;
private TwoToOne twoToOne;
private TwoToTwo twoToTwo;
/**
* one、two RadioGroup 控件
*/
private RadioGroup twoGroup;
protected RadioButton twoOne, twoTwo;
/**
* 加载页面
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mainActivity = getActivity();
inflater = LayoutInflater.from(getActivity());
// 初始化控件和声明事件
// rootView = inflater.inflate(R.layout.two, null);
twoGroup = (RadioGroup) getActivity().findViewById(R.id.two_group);
twoOne = (RadioButton) getActivity().findViewById(R.id.two_one);
twoTwo = (RadioButton) getActivity().findViewById(R.id.two_two);
//控件颜色
twoOne.setTextColor(getResources().getColor(R.color.red));
twoTwo.setTextColor(getResources().getColor(R.color.black));
twoOne.setOnClickListener(this);
twoTwo.setOnClickListener(this);
setDefaultFragment();
}
/**
* 设置默认的Fragment
*/
private void setDefaultFragment()
{
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
twoToOne = new TwoToOne();
transaction.add(R.id.framelayout, twoToOne).commit();
}
@Override
public void onClick(View v) {
FragmentManager fm = getFragmentManager();
// 开启Fragment事务
FragmentTransaction transaction = fm.beginTransaction();
switch (v.getId())
{
case R.id.two_one:
if (twoToOne == null)
{
twoToOne = new TwoToOne();
}
// 使用当前Fragment的布局替代id_content的控件
transaction.replace(R.id.framelayout, twoToOne);
//控件颜色
twoOne.setTextColor(getResources().getColor(R.color.red));
twoTwo.setTextColor(getResources().getColor(R.color.black));
break;
case R.id.two_two:
if (twoToTwo == null)
{
twoToTwo = new TwoToTwo();
}
transaction.replace(R.id.framelayout, twoToTwo);
//控件颜色
twoOne.setTextColor(getResources().getColor(R.color.black));
twoTwo.setTextColor(getResources().getColor(R.color.red));
break;
}
// transaction.addToBackStack();
// 事务提交
transaction.commit();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.two, null);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/height_title"
android:background="@color/white" >
<LinearLayout
android:id="@+id/layout_brck"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/margin_15dp"
android:orientation="horizontal" >
</LinearLayout>
<RadioGroup
android:id="@+id/two_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/two_one"
style="@style/homework_tab_item"
android:layout_marginRight="@dimen/margin_20dp"
android:background="@null"
android:checked="true"
android:text="one"
android:textColor="@color/black"
android:textSize="@dimen/title_textsize_22sp" />
<RadioButton
android:id="@+id/two_two"
style="@style/homework_tab_item"
android:layout_margin="5dp"
android:layout_marginLeft="@dimen/margin_20dp"
android:background="@null"
android:text="two"
android:textColor="@color/black"
android:textSize="@dimen/title_textsize_22sp" />
</RadioGroup>
<View
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:layout_alignParentBottom="true"
android:background="@color/br_title_color" />
</RelativeLayout>
<FrameLayout
android:id="@+id/framelayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</FrameLayout>
</LinearLayout>
OK。大体就是这样了。示例图如下:
DEMO链接:DEMO链接
这是一个eclipse资源,因为是之前写好的,所以就直接用了,写了这篇文章,如果看懂了这些代码,相应的Android studio应该也很简单。