使用SlidingMenu創建左側滑動菜單+Fragment的簡單用法——學習筆記

一、導入SlidingMenu庫關聯庫。

    首先在github上下載壓縮包。
    下載地址是:https://github.com/jfeinstein10/SlidingMenu
    下載得到SlidingMenu-master.zip文件,解壓後進入library文件夾,然後複製它的路徑(比如F:\AndroidStudioProjects\Library\SlidingMenu-master\library),將其導入到項目中,步驟是File→New→Import Module,粘貼了路徑後把Module name設置成【:SlidingMenu-library】,然後finish。
    幾乎任何直接導入的庫都是會出問題的,所以要把gradle裏面一些數字設置的和自己項目gradle的一樣,這個SlidingMenu的gradle裏面還可以把buildscript{}給註釋掉,然後就可以使用了。
    不過不要忘了將這個庫給自己的項目添加依賴,在Project模式下的App文件上右鍵,選中Open Module Setting,然後是Dependencies,點右邊那個【+】號,選擇第三個,Module Dependency,將SlidingMenu庫添加。如果忘記添加依賴,那就白導入庫了。
    最後最後,運行了還是會報錯。
    Error:(303, 27) 錯誤: 找不到符號
    符號:   方法 sin(float)
    位置: 類 FloatMath
    這時候進入FloatMath類,會發現sin(float)方法其實就是:
    return (float) Math.sin(angle);
    所以把FloatMath.sin(f)改爲Math.sin(f)即可。
    (雖然這些過程我已經非常熟悉,還是要寫一下,享受拍打鍵盤和揮霍時間的快感)

二、粗略的操作步驟

    將MainActivity繼承的AppCompatActivity改爲SlidingFragmentActivity,然後把onCreate的修飾由protect改成public,之後就是如何寫代碼了。
 1.配置主頁面
 setContentView(R.layout.activity_main);
 2.配置左側菜單佈局
 setBehindContentView(R.layout.activity_left);
 3.配置菜單使用模式:左側可用
 SlidingMenu slidingMenu = getSlidingMenu();
 slidingMenu.setMode(SlidingMenu.LEFT);
 4.設置拖拽區域:整個屏幕
 slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
 5.配置主頁面留着屏幕的寬度:200像素
 slidingMenu.setBehindOffset(200);  
 如果想添加一個右菜單的話,可以在第3步後面加上代碼
 slidingMenu.setSecondaryMenu(R.layout.activity_rightmenu);
 不過一般很少看見這種設計。

以下是代碼——
MainActivity:

public class MainActivity extends SlidingFragmentActivity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initSlidingMenu();


    }

    private void initSlidingMenu(){
        setContentView(R.layout.activity_main); //1.設置主頁面
        setBehindContentView(R.layout.activity_leftmenu); //2.設置左側菜單
        SlidingMenu slidingMenu = getSlidingMenu(); //3.配置菜單
        slidingMenu.setMode(SlidingMenu.LEFT); //4.設置菜單顯示模式爲左側可用
        slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//5.設置滑動模式爲全屏滑動
        slidingMenu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);//同時給左菜單添加滑動,如果不添加的話你會發現滑開左側菜單後,不能從菜單滑回主頁面
        slidingMenu.setBehindOffset(DensityUtils.dip2px(MainActivity.this, 100));//6.設置主頁佔據的寬度
    }
}

左菜單佈局:R.layout.activity_leftmenu

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/left_menu"
             android:background="@android:color/holo_blue_light"
             android:layout_width="match_parent"
             android:layout_height="match_parent">

    <TextView
        android:text="我就是左側菜單!!"
        android:textSize="30sp"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</FrameLayout>

主頁面佈局:R.layout.activity_main

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_content_fl"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:text="主頁面"
        android:textSize="30sp"
        android:textColor="@android:color/holo_blue_light"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</FrameLayout>

效果圖
這裏寫圖片描述

接下來說一下Fragment的簡單用法(懶得再寫一篇啦!!!而且講Fragment還需要用刀一點上面的東西來做對比)

如果要把主頁面和左側菜單的佈局替換成Fragment,那麼首先就需要創建左菜單fragment和主頁面fragment,由於每次創建fragment都要重寫由於每次創建Fragment老是要去重寫onCreate(),onCreateView(),onActivityCreated()等方法,所以乾脆創建一個基類,在基類裏面重寫這些方法,然後讓需要重寫這些方法的Fragment都來繼承這個基類,這樣就省去一些麻煩。

接下來寫一個Fragment的基類——BaseFragment:

public abstract class BaseFragment extends Fragment {
    public Context context;
//    public Activity context;

    //當Fragment被創建時候調用這個方法
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getActivity();
//        context = getActivity();
    }

    //當視圖被創建的時候回調
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return initView();
    }

    //當Activity被創建之後被回調
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initData();
    }

    //讓child實現自己的視圖,達到child自己特有的效果,這個是強制child去實現的
    public abstract View initView();

    /**
     * 1.如果子頁面沒有數據,聯網請求數據,並綁定到initView初始化的視圖上
     * 2.如果有數據,就直接綁定
     */
    public void initData(){}
}

基類創建好後,來創建左菜單Fragment以及主頁面Fragment
左菜單Fragment——LeftMenuFragment:

public class LeftMenuFragment extends BaseFragment {
    private TextView textView;

    @Override
    public View initView() {
        textView = new TextView(context);
        textView.setTextSize(30);
        textView.setGravity(Gravity.CENTER);
        LogUtil.e("左側菜單頁面被初始化");
        return textView;
    }

    @Override
    public void initData() {
        super.initData();
        textView.setText("吾乃常山趙子龍!");
        Log.e("左側數據被初始化");
    }
}

主頁面Fragment——ContentFragment:

public class ContentMenuFragment extends BaseFragment {

    private TextView textView;

    @Override
    public View initView() {
        textView = new TextView(context);
        textView.setTextSize(30);
        textView.setGravity(Gravity.CENTER);
        LogUtil.e("主頁面被初始化");
        return textView;
    }

    @Override
    public void initData() {
        super.initData();
        textView.setText("臥龍鳳雛,得一而安天下!");
        Log.e("主頁面數據被初始化");
    }
}

當然了,上面寫在initData的setText方法可以寫在initView中,之所以寫在initData中是爲了形成一種數據和視圖分離的思維,有一點扯淡,就是見仁見智的事情吧,也不太好說明。

這兩個Fragment寫完之後,在MainActivity裏面替換即可,接下來初始化Fragment並且替換佈局,
在MainActivity中寫一個方法:

private void initFragment(){
        FragmentManager fm = getSupportFragmentManager(); //獲取manager
        FragmentTransaction ft = fm.beginTransaction(); //開啓事務
        ft.replace(R.id.main_content_fl, new ContentMenuFragment(), CONTENT_MENU_TAG); //替換主頁面,第三個設置的Tag參數用於找到這個Fragment
        ft.replace(R.id.left_menu, new LeftMenuFragment(), LEFT_MENU_TAG); //替換左側菜單
        ft.commit();//提交
    }

把上面這個方法添加到onCreat中即可,注意最後的commit()千萬別忘了,我就是忘記寫這個,然後頁面一直是原來的內容,我找了好久問題所在!!!
以下是運行結果
這裏寫圖片描述
可以發現,Fragment並沒有真正的替換掉原佈局中的TextView,只是覆蓋在上面了,只要把原佈局中的TextView相關代碼刪除或者註釋掉即可。以下是刪除後的運行結果:
這裏寫圖片描述

然後下面是MainActiviy的最終代碼:

public class MainActivity extends SlidingFragmentActivity{


    private static final String CONTENT_MENU_TAG = "content_menu_tag";
    private static final String LEFT_MENU_TAG = "left_menu_tag";

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                AlertDialog.Builder build = new AlertDialog.Builder(this);
                build.setTitle("注意")
                        .setMessage("確定要退出嗎?")
                        .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                finish();
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                            }
                        })
                        .show();
                break;
            default:
                break;
        }
        return false;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initSlidingMenu();
        initFragment();
    }

    private void initSlidingMenu(){
        setContentView(R.layout.activity_main); //1.設置主頁面
        setBehindContentView(R.layout.activity_leftmenu); //2.設置左側菜單
        SlidingMenu slidingMenu = getSlidingMenu(); //3.配置菜單
        slidingMenu.setMode(SlidingMenu.LEFT); //4.設置菜單顯示模式爲左側可用
        slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//5.設置滑動模式爲全屏滑動
        slidingMenu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);//同時給左菜單添加滑動
        slidingMenu.setBehindOffset(DensityUtils.dip2px(MainActivity.this, 100));//6.設置主頁佔據的寬度
    }

    private void initFragment(){
        FragmentManager fm = getSupportFragmentManager(); //獲取manager
        FragmentTransaction ft = fm.beginTransaction(); //開啓事務
        ft.replace(R.id.main_content_fl, new ContentMenuFragment(), CONTENT_MENU_TAG); //替換主頁面,第三個設置的Tag參數用於找到這個Fragment
        ft.replace(R.id.left_menu, new LeftMenuFragment(), LEFT_MENU_TAG); //替換左側菜單
        ft.commit();//不能忘不能忘不能忘!!!!
    }
}

多了一個重寫的onKeyDown()方法,這個方法用來設置點擊返回鍵是否退出程序。
下面是運行圖:
這裏寫圖片描述

發佈了31 篇原創文章 · 獲贊 53 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章