Android学習ノートのAndBaseフレームワーク学習(七)SlidingMenuスライドメニューの実現

14388 ワード

PS:がんばって前へ飞ぶ..どんなに疲れてもかまわない..
 
学習内容:
1.SlidingMenuでスライドメニューを実現する..
 
SlidingMenuスライドメニュー..スライドメニューはほとんどのappにも存在します.非常に実用的です..Githubある牛人はこの本を簡単なフレームワークに書いた.関連するリソースを参照するだけでスライドメニューの実装を完了できます.この層の基礎ができた.スライドメニューが簡単に実現できます..私达の最も熟知しているQQを持って言いましょう..スライド操作を行うと...新しいViewが元のViewを上書きします.新しいビューのコントロールをトリガーすることで、他の操作を実行できます.
SlidingMenuの実現には多くの方法がある.个人感覚の最も実用的な方式はやはりSlidingFragmentを受け継ぐ方式を使って実现します..これにより、より多くのFragmentを追加してビューを表示することができます.まず、最も簡単な方法でスライドを実現した後、左側にスライドビューが表示されます.
1.最も基本的な方法でSlidingMenuを実現する
SlidingMenuオブジェクトの作成を使用する..次に関連パラメータの設定を行います..このスライドメニューを関連するActivityに追加するとスライドメニューの作成が完了します...
package com.darker;

import android.app.Activity;
import android.os.Bundle;

import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;

public class MainActivity extends Activity {

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

        SlidingMenu menu = new SlidingMenu(this); //          ..
        menu.setMode(SlidingMenu.LEFT);
        //          
        menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        menu.setShadowWidthRes(R.dimen.shadow_width);
        menu.setShadowDrawable(R.drawable.shadow);

        //            
        menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
        //           
        menu.setFadeDegree(0.35f);
        //            Activity ,   SLIDING_CONTENT , SLIDING_WINDOW
        menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
        //          
        menu.setMenu(R.layout.leftmenu);

    }

}

ここでは、オブジェクトを直接作成し、関連するプロパティを設定します.スライドメニューを作成する..レイアウトファイルにSlidingMenuを書くこともできますそしてIDを取得することでスタイルを指定する..スライドメニューも作成できます...レイアウトの方式はこの方式を採用します..では、このレイアウトはcomを呼び出します.jeremyfeinstein.slidingmenu.lib.SlidingMenuはSlidingMenuを作成します.
 <com.jeremyfeinstein.slidingmenu.lib.SlidingMenu
            xmlns:sliding="http://schemas.android.com/apk/res-auto"
            android:id="@+id/slidingmenulayout"
            android:layout_width="120dp"
            android:layout_height="170dp"
            android:background="#ffffffff"
            sliding:behindOffset="0dp"
            sliding:behindScrollScale="1"
            sliding:fadeDegree="0.3"
            sliding:fadeEnabled="true"
            sliding:touchModeAbove="fullscreen"
            sliding:viewAbove="@layout/pic">
</com.jeremyfeinstein.slidingmenu.lib.SlidingMenu>

作成されたSlidingMenuはxmlで指定されたサイズと位置に従って表示されます.ダイナミックレイアウトとこのような静的レイアウトの違いはそれほど大きくありません...ダイナミックには手動で作成する必要があります.オブジェクトを作成する方法で..静的はxmlファイルを呼び出す方法です.結局SlidingMenuのコンストラクション関数を呼び出してスライドメニューを作成します...
package com.Darker;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;

public class MainActivity extends Activity {
    private SlidingMenu mLeftMenu;

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

        mLeftMenu = (SlidingMenu) findViewById(R.id.slidingmenulayout);
        // configure the SlidingMenu
        // SlidingMenu menu = new SlidingMenu(this);
        mLeftMenu.setMode(SlidingMenu.LEFT);
        //          
        mLeftMenu.setShadowWidthRes(R.dimen.shadow_width);
        mLeftMenu.setShadowDrawable(R.drawable.shadow);

        mLeftMenu.setMenu(R.layout.leftmenu);

        mLeftMenu.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mLeftMenu.isMenuShowing())
                    mLeftMenu.toggle();
            }
        });
    }

}

2.SlidingMenuを作成するには、別の方法を使用します.
2つ目の方法は、スライドメニューをextends SlidingFragmentActivityで実現することです.それは...ここまで言うとFragmentと言わざるを得ない.これはAndroid 3.0で正式に導入された新しい概念です.しかしAndroid 4.0で正式に有効になった.
Fragmentは破片管理と呼ばれていますが、この名前は私にその役割と毛の関係があると感じさせます.私は本当によく分かりません.やはりその具体的な機能を話しましょう..Fragmentは軽量級だappはマルチActivityで管理されているので..だからインタフェースが多いとき..複数のActivityを作成する必要があります.ActivityはIntentを通じてデータ情報の伝達とインタラクティブな過程を完成する.しかし、複数のActivityで問題が発生します.アプリケーションに関するメンテナンスを行う場合、Activityが多いため..メンテナンス性も劣る.多くのActivityはAndroidManifestプロファイルを非常に読みにくくします.そこでここではFragmentという概念を導入する.内部パッケージの方法でinflaterを直接入手することができる.これでinflateレイアウトに直接行けます.
Fragmentの使用はxmlレイアウトファイルに定義できます.
    <fragment 
        android:id="@+id/fragment"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>

このようにxmlファイル内でfragmentを定義、メイン関数内でIDを取得することでfragmentを設定してもよい.でも個人的には...fragmentはダイナミックに作成することでより使いやすい..簡単なfragmentの定義方法..
package com.Darker;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MainTab01 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.main_tab_01, container, false);
    }
}

Fragmentサブクラスを直接作成します.継承によって..これにより内部の属性の大部分を継承することができる.この方法は非常に一般的な方法です実は現在のActivityのinflaterを手に入れて、直接Viewに新しいレイアウトをロードします.これでActivityに直接fragmentを追加できます...余計なことを言っても無駄だ.コードを...
package com.Darker;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.Window;

import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;

public class MainActivity extends SlidingFragmentActivity {

    private ViewPager mViewPager;              //ViewPager      View..          ..
    private FragmentPagerAdapter mAdapter;  //Fragment   ..
    private List<Fragment> mFragments = new ArrayList<Fragment>();  //    List..    Fragment..

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        //    SlideMenu
        initRightMenu();
        //    ViewPager
        initViewPager();

    }

    private void initViewPager() {
        mViewPager = (ViewPager) findViewById(R.id.id_viewpager);  //  ViewPager..
        
        /**
         *           Activity..   Fragment..
         * */
        
        MainTab01 tab01 = new MainTab01();   
        MainTab02 tab02 = new MainTab02();
        MainTab03 tab03 = new MainTab03();
        
        //   Fragment   List ..
        mFragments.add(tab01);
        mFragments.add(tab02);
        mFragments.add(tab03);
        /**
         *    Adapter..
         */
        mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public int getCount() {
                return mFragments.size();  //  Fragment   ..
            }

            @Override
            public Fragment getItem(int arg0) {
                return mFragments.get(arg0);  //  Fragment   ..
            }
        };
        mViewPager.setAdapter(mAdapter);
    }

    //            ...
    private void initRightMenu() {
        
        Fragment leftMenuFragment = new MenuLeftFragment(); //      View..
        setBehindContentView(R.layout.left_menu_frame);      //          ..
        
        /**
         *            ..
         *                .              ..
         *      replace              ...
         *           ..
         * */
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.id_left_menu_frame, leftMenuFragment).commit();
        SlidingMenu menu = getSlidingMenu();              //        ..
        menu.setMode(SlidingMenu.LEFT_RIGHT);              
        //          
        menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
        menu.setShadowWidthRes(R.dimen.shadow_width);
        menu.setShadowDrawable(R.drawable.shadow);
        //            
        menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
        //           
        menu.setFadeDegree(0.35f);
        menu.setSecondaryShadowDrawable(R.drawable.shadow);
        
        //      (  )    
        menu.setSecondaryMenu(R.layout.right_menu_frame);
        Fragment rightMenuFragment = new MenuRightFragment();
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.id_right_menu_frame, rightMenuFragment).commit();
    }
    
    //              ..
    public void showLeftMenu(View view) {
        getSlidingMenu().showMenu();
    }

    //              ..
    public void showRightMenu(View view) {
        getSlidingMenu().showSecondaryMenu();
    }
}

ここではextends SlidingFragmentActivityによって実現されたものを見ることができます.ここではViewPagerを使用しています複数のインタフェースを保存するために使用する.スライドを実現する..ここでは2つのスライドメニューを定義します.この2つのスライドメニューは、スクリーンの最左右側を人為的にスライドすることでトリガを完了する.スライド..スライドのサブメニューも展示されます..サブメニューを操作して、より多くの操作を行うこともできます.ここでは現在のActivityがSlidingFragmentActivityを継承しているから実現した左右のメニューを継承して一緒に設定するわけではない.普通のActivityを継承することでも実現できる…ここは誤区に入らないでください.
SlidingFragmentActivityを継承したのは、現在のプライマリActivityがfragmentの形式を追加してスライドを完了することを望んでいるからです...
もう一つ言いたいのは、ViewPagerもアダプタを設定する必要があることです.ここではAndroidシステムに付属のFragmentPageAdapterを使用しています.実はPagerAdapterを継承することによって実現されたのです.抽象的な方法を書き直すだけでいいのです要するに実現の過程は非常に簡単です...
最後に前のソースコードを添付して皆さんに提供します.http://files.cnblogs.com/files/RGogoing/zhy_slidingmenu_demo.rar(ソースコードは本人が書いたものではありません..このソースコードは主にSlidingMenuの使い方についてです.)