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

   1、actionbar + viewpager

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

android 菜单导航 (Fragment + RadioGroup)_第1张图片

在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的代码只是小小不同。

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


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

     运行结果图:

android 菜单导航 (Fragment + RadioGroup)_第2张图片

android 菜单导航 (Fragment + RadioGroup)_第3张图片


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

     总结下:

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

       另外,不要一味的追求某一种方式 或者 一味依赖别人显示的样式设计,而是要先自己思考,用自己已经学过的知识是否能实现一样的效果,这样才能真正掌握。

       总之,能够实现一样的效果,一样的功能,且性能没有受到很大影响的情况下,这样的解决方法就是好方法。