您的位置:首页 > 移动开发 > Android开发

android 菜单导航 (Fragment + RadioGroup)

2013-12-31 19:11 239 查看
网上有很多讲利用Fragment + RadioGroup,actionbar + viewPager和TabHost做菜单导航和切换的例子。对于第三种现在已经过时了。所以讲讲自己对第一个的理解和经验分享,不过在此也简单说说第二种。

1、actionbar + viewpager
对于这种方式,其实在利用eclipse创建Activity的时候就可以直接让eclipse来为我们做好这样的模板。不过要在创建工程时使要求的最小SDK大于或等于11(也可以在配置文件中修改)



在Navigation type选择:Scrollable tabs + swipe 或者 Fixed Tabs + swipe。
这样就会自动生成所需的菜单导航的结构。这样可以将生成的现有代码和xml布局赋值到自己想要的Activity类中和xml布局文件中。

里面具体的细节又是怎么样的呢?查看生成的代码,用到的类也就ActionBar,ViewPager,FragmentPagerAdapter以及Fragment。

如果想要加载自己的xml布局文件,那么可以将导航菜单和布局文件用两个数组保存。在getItem(int position)中使用(position是从0开始的),并且给Fragment传递布局文件参数就可以了。如果希望每个布局文件中控件拥有像点击、滑动的功能等,自己可以获取相应的引用后进行操作。
2、RadioGroup + Fragment

package com.example.zzz;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
//import android.support.v4.app.Fragment;
//import android.support.v4.app.FragmentActivity;
public class MainFragment2 extends Activity{
RadioGroup group;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

group = (RadioGroup) findViewById(R.id.group);
group.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(RadioGroup group, int checkedId) {
click(checkedId);
}
});
}

void click(int id){
ItemFragment item = new ItemFragment();
Bundle bun = new Bundle();
switch (id) {
case R.id.one:
bun.putInt(ItemFragment.LAYOUT, R.layout.one);
break;
case R.id.two:
bun.putInt(ItemFragment.LAYOUT, R.layout.two);
break;
default :
return;
}
item.setArguments(bun);
getFragmentManager()
.beginTransaction()
.replace(R.id.content, item)
.commit();
/*getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content, item)
.commit();*/

}

public static class ItemFragment extends Fragment {
static final String LAYOUT = "layout";
int layout = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
layout = getArguments().getInt(LAYOUT);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = null;
if(layout == 0){
v = new View(getActivity());
}else{
v = inflater.inflate(layout, container, false);
}
return v;
}
}
}


至于布局文件就很简单了:一个FrameLayout和一个RadioGroup放在LinearLayout中就ok了

而在代码中核心也就这么几句
getFragmentManager()
.beginTransaction()
.replace(R.id.content, item)
.commit();


如果大家对于java swing/awt比较熟悉的话,那么一定知道CardLayout布局,FrameLayout和它是一样的。只能显示一个控件。在写java GUI的时候是放入JPanel,而在写android的时候就可以Fragment。

简单一句话,这样的菜单导航实际上就是在FragmentLayout容器中进行切换而已。不过对于SDK小于11的和大于等于11的代码只是小小不同。


,如果把android和HTML做相似比较的话,那么FrameLayout容器和iframe标签或者Frame布局是不是很像了。在网页中,让一个连接target到某个iframe或者frame中去,而在android中就是一个替换旧的那个。

如果在android中想将菜单放在自己想要的位置(可以是底部,顶部,两边)都可以。只要在xml布局文件中配置就行啦。如果想把菜单设计的漂亮一点,那就好好的对RadioButton美化下吧,多加点样式。

运行结果图:








好了!!!!!!!!!!!

总结下:

不管学什么,我觉得学习新东西的时候,可以将它与自己已经掌握的只是进行类比,特别是设计思想,设计方式,显示型式等等。

另外,不要一味的追求某一种方式 或者 一味依赖别人显示的样式设计,而是要先自己思考,用自己已经学过的知识是否能实现一样的效果,这样才能真正掌握。
总之,能够实现一样的效果,一样的功能,且性能没有受到很大影响的情况下,这样的解决方法就是好方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息