プログラム(二)fragmentの切り替えとtoolbarが異なるページで表示するmenuが異なることを模倣する

19382 ワード

前編ではトップページの基本フレームワークを組み立てましたが、今日は私たちの仕事を続けます.左側のサイドスライドメニューがあります.それに対応するページをロードしましょう.私达は知っている时、あなたは発见することができて、トップページ、発见して、関心を持って、コレクション、下書きのこの5项、あなたはクリックした后に相応のページに入って、サイドスライドのメニューはまだあって、あなたの左侧は滑って、このサイドスライドのメニューはまだあって、质问して、左はスクリーンを滑って、このページはなくて、少し前のページに戻る感じに似ています.
操作から見ると、5ページはfragment間の切り替えであり、質問は個別のactivityであるべきである.
まずいくつかのfragmentから始めます.ここでは5 fragmentページを作成し、androidから継承することを選択します.support.v4.app.Fragmentは、この5つのページは基本的に同じなので、簡単なレイアウトで、タイトルが表示されます.それぞれは
トップページ:IndexFragment.java
発見:FindFragment.java
注目:AttentionFragment.java
コレクション:CollectionFragment.java
下書き:DraftFragment.java
コードはトップページを例に挙げます.
     fragment_index.xml



    


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

/**
 *   
 * Created by cg on 2015/10/27.
 */
public class IndexFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_index,container,false);

        return view;
    }
}

fragmentページ間の切り替えは、これはみんなできますが、ここでは詳しくは言いませんが、この点がまだ明確ではないと感じたら、blogをお勧めします.http://blog.csdn.net/lmj623565791/article/details/42628537
ここで強調したいのは、一般的にfragmentページの切り替えを行うときは、replaceメソッドを採用し、切り替えを行うのですが、実はreplace側はremoveメソッドとaddメソッドの合体であり、私たちのコードを簡単にすることができます.しかし、ここで問題が発生します.この方法は、削除と追加です.つまり、切り替えたときに再ロードされます.つまり、データを読み込むと、データを読み直し、再ロードします.これはローカルデータベースを読むとき、大したことではないかもしれませんが、ネットワークデータを読むとき、これはトラフィックを浪費しているので、私たちはこの方法を使うことができません.ここではhide、show、方法を使って、隠しと表示の方法で切り替えます.次の一般的な方法です.コードは次のとおりです.
/**
     *  fragment     ,            fragment          
     * @param from
     * @param to
     */
    public void switchContent(Fragment from, Fragment to) {
        if (isFragment != to) {
            isFragment = to;
            FragmentManager fm = getSupportFragmentManager();
            //         
            FragmentTransaction ft = fm.beginTransaction();
            if (!to.isAdded()) {    //       add 
                ft.hide(from).add(R.id.frame_main, to).commit(); //      fragment,add    Activity 
            } else {
                ft.hide(from).show(to).commit(); //      fragment,     
            }
        }
    }
    ,     fragment     ,            ,         ,                ,                。
      ,           ,           ,   mainActivity  ,implements    ,
          tool_NavigationDrawerFragment.java。    :
import android.app.Fragment;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;

import com.example.cg.zhihu_one.Adapters.Main_Drawer_lv_Adapter;
import com.example.cg.zhihu_one.models.MainDrawerMenu;

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

/**
 *       
 * Created by cg on 2015/10/23.
 */
public class tool_NavigationDrawerFragment extends Fragment {
    private ListView lv_main_drawer_leftmenu;                                                 //     listView
    private List list_menu;


    /**
     *          ,     Activity  
     */
    public interface menuClickListener
    {
        void menuClick(String menuName);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_main_drawer,container,false);

        initleftMenuContral(view);

        return view;
    }

    /**
     *          listView,    ,      
     * @param view
     */
    private void initleftMenuContral(View view) {
        lv_main_drawer_leftmenu = (ListView)view.findViewById(R.id.lv_main_drawer_leftmenu);
        list_menu = getMenuItem();
        lv_main_drawer_leftmenu.setAdapter(new Main_Drawer_lv_Adapter(getActivity(),list_menu));
        lv_main_drawer_leftmenu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView> parent, View view, int position, long id) {
                if(getActivity() instanceof menuClickListener)
                {
                    ((menuClickListener)getActivity()).menuClick(list_menu.get(position).getMainDrawer_menuName());
                }
            }
        });
    }

    /**
     *  arrays.xml     ,  list 
     * @return
     */
    private List getMenuItem()
    {
        List list_menu = new ArrayList();

        String[] itemTitle = getResources().getStringArray(R.array.item_title);
        TypedArray itemIconRes = getResources().obtainTypedArray(R.array.item_icon_res);

        for(int i=0;iimport android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity implements tool_NavigationDrawerFragment.menuClickListener {

    private Toolbar toolbar;                             //  toolbar
    private ActionBarDrawerToggle mDrawerToggle;         //  toolbar            
    private DrawerLayout drawer_main;                    //        ,       

    private IndexFragment iFragment;                     //    fragment
    private FindFragment fFragment;                      //    fragment
    private AttentionFragment aFragment;                 //    fragment
    private CollectionFragment cFragment;                //    fragment
    private DraftFragment dFragment;                     //    fragment


    private Fragment isFragment;                         //         fragment

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

        initToolbar();
        initFragment(savedInstanceState);
    }

    /**
     *    Toolbar,   Toolbar       ,  DrawerLayout.DrawerListener   ,      
     */
    public void initToolbar()
    {
        toolbar = (Toolbar)this.findViewById(R.id.toolbar);
        toolbar.setTitle(R.string.menu_index);                     //        setSupportActionBar  ,     
        setSupportActionBar(toolbar);

        //    ,           ,        
        drawer_main = (DrawerLayout) findViewById(R.id.drawer_main);
        mDrawerToggle = new ActionBarDrawerToggle(this, drawer_main, toolbar, R.string.drawer_open,
                R.string.drawer_close);
        mDrawerToggle.syncState();
        drawer_main.setDrawerListener(mDrawerToggle);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.main_toolbar_shuffle) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    /**
     *           fragment
     */
    public void initFragment(Bundle savedInstanceState)
    {
        //  activity    ,    ,        fragment.
        if(savedInstanceState==null) {
            FragmentManager fm = getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            if(iFragment==null) {
                iFragment = new IndexFragment();
            }
            isFragment = iFragment;
            ft.replace(R.id.frame_main, iFragment).commit();
        }
    }

    /**
     *              
     * @param menuName       
     */
    @Override
    public void menuClick(String menuName) {

        getSupportActionBar().setTitle(menuName);                                   //  Toolbar     

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        switch (menuName)
        {
            case "  " :
                if(iFragment!=null) {
                    iFragment = new IndexFragment();
                }
                switchContent(isFragment,iFragment);
                break;
            case "  " :
                if(fFragment==null)
                {
                    fFragment = new FindFragment();
                }
                switchContent(isFragment,fFragment);
                break;
            case "  " :
                if(aFragment==null)
                {
                    aFragment = new AttentionFragment();
                }
                switchContent(isFragment,aFragment);
                break;
            case "  " :
                if(cFragment==null)
                {
                    cFragment = new CollectionFragment();
                }
                switchContent(isFragment,cFragment);
                break;
            case "  " :
                if(dFragment==null)
                {
                    dFragment = new DraftFragment();
                }
                switchContent(isFragment,dFragment);
                break;
            case "  " :

                break;
        }

        invalidateOptionsMenu();

        /**
         *         
         */
        drawer_main.closeDrawers();
    }

    /**
     *  fragment     ,            fragment          
     * @param from
     * @param to
     */
    public void switchContent(Fragment from, Fragment to) {
        if (isFragment != to) {
            isFragment = to;
            FragmentManager fm = getSupportFragmentManager();
            //         
            FragmentTransaction ft = fm.beginTransaction();
            if (!to.isAdded()) {    //       add 
                ft.hide(from).add(R.id.frame_main, to).commit(); //      fragment,add    Activity 
            } else {
                ft.hide(from).show(to).commit(); //      fragment,     
            }
        }
    }
}
    ,       ,  
                ,       fragment    。  toolbar           。           getSupportActionBar().setTitle(menuName)
;        toolbar title 。 initFragment            ,  if(savedInstanceState==null)   ,                   
      ,       blog                  ,           。
                            ,           ,   toolbar ,   menu,  menu             ,    ,
       ,       ,    ,toolbar   menu        。
       ,      onCreateOptionsMenu      ,      ,     ,  menu        ,       menu     。
onPrepareOptionsMenuという方法は、menuをクリックするたびにトリガーされますが、この方法も私たちが使っています.左側のサイドスライドメニューをクリックしてmenuを変更するからです.
もう一つの方法はinvalidateOptionsMenu()です.この方法は元の埋めたmenuを無効にするので、サイドスライドメニューをクリックするたびに、これを付けてOKです.
MainActivty.JAvaコードは次のとおりです.
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements tool_NavigationDrawerFragment.menuClickListener {

    private Toolbar toolbar;                             //  toolbar
    private ActionBarDrawerToggle mDrawerToggle;         //  toolbar            
    private DrawerLayout drawer_main;                    //        ,       

    private IndexFragment iFragment;                     //    fragment
    private FindFragment fFragment;                      //    fragment
    private AttentionFragment aFragment;                 //    fragment
    private CollectionFragment cFragment;                //    fragment
    private DraftFragment dFragment;                     //    fragment


    private Fragment isFragment;                         //         fragment
    private boolean isMenuShuffle = false;               //      toolbar      

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

        initToolbar();
        initFragment(savedInstanceState);
    }

    /**
     *    Toolbar,   Toolbar       ,  DrawerLayout.DrawerListener   ,      
     */
    public void initToolbar()
    {
        toolbar = (Toolbar)this.findViewById(R.id.toolbar);
        toolbar.setTitle(R.string.menu_index);                     //        setSupportActionBar  ,     
        setSupportActionBar(toolbar);

        //    ,           ,        
        drawer_main = (DrawerLayout) findViewById(R.id.drawer_main);
        mDrawerToggle = new ActionBarDrawerToggle(this, drawer_main, toolbar, R.string.drawer_open,
                R.string.drawer_close);
        mDrawerToggle.syncState();
        drawer_main.setDrawerListener(mDrawerToggle);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {


        switch (item.getItemId())
        {
            case R.id.main_toolbar_search:
                Toast.makeText(this, "main_toolbar_search", Toast.LENGTH_LONG).show();
                break;
            case R.id.main_toolbar_notify:
                Toast.makeText(this, "main_toolbar_notify", Toast.LENGTH_LONG).show();
                break;
            case R.id.main_toolbar_about:
                Toast.makeText(this, "main_toolbar_about", Toast.LENGTH_LONG).show();
                break;
            case R.id.main_toolbar_register:
                Toast.makeText(this,"main_toolbar_register",Toast.LENGTH_LONG).show();
                break;
            case R.id.main_toolbar_shuffle:
                Toast.makeText(this,"main_toolbar_shuffle",Toast.LENGTH_LONG).show();
                break;
        }


        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        //Log.e("isMenuShuffle",isMenuShuffle + "");
        if(isMenuShuffle)
        {
            menu.findItem(R.id.main_toolbar_shuffle).setVisible(true);
        }else
        {
            menu.findItem(R.id.main_toolbar_shuffle).setVisible(false);
        }
        return super.onPrepareOptionsMenu(menu);
    }

    /**
     *           fragment
     */
    public void initFragment(Bundle savedInstanceState)
    {
        //  activity    ,    ,        fragment.
        if(savedInstanceState==null) {
            FragmentManager fm = getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            if(iFragment==null) {
                iFragment = new IndexFragment();
            }
            isFragment = iFragment;
            ft.replace(R.id.frame_main, iFragment).commit();
        }
    }

    /**
     *              
     * @param menuName       
     */
    @Override
    public void menuClick(String menuName) {

        getSupportActionBar().setTitle(menuName);                                   //  Toolbar     

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        switch (menuName)
        {
            case "  " :
                if(iFragment!=null) {
                    iFragment = new IndexFragment();
                }
                switchContent(isFragment,iFragment);
                isMenuShuffle = false;
                break;
            case "  " :
                if(fFragment==null)
                {
                    fFragment = new FindFragment();
                }
                switchContent(isFragment,fFragment);
                isMenuShuffle = true;
                break;
            case "  " :
                if(aFragment==null)
                {
                    aFragment = new AttentionFragment();
                }
                switchContent(isFragment,aFragment);
                isMenuShuffle = false;
                break;
            case "  " :
                if(cFragment==null)
                {
                    cFragment = new CollectionFragment();
                }
                switchContent(isFragment,cFragment);
                isMenuShuffle = false;
                break;
            case "  " :
                if(dFragment==null)
                {
                    dFragment = new DraftFragment();
                }
                switchContent(isFragment,dFragment);
                isMenuShuffle = false;
                break;
            case "  " :
                isMenuShuffle = false;
                /*Intent qIntent = new Intent();
                qIntent.setClass(this,QuestionAcivity.class);
                startActivity(qIntent);*/
                break;
        }

        invalidateOptionsMenu();

        /**
         *         
         */
        drawer_main.closeDrawers();
    }

    /**
     *  fragment     ,            fragment          
     * @param from
     * @param to
     */
    public void switchContent(Fragment from, Fragment to) {
        if (isFragment != to) {
            isFragment = to;
            FragmentManager fm = getSupportFragmentManager();
            //         
            FragmentTransaction ft = fm.beginTransaction();
            if (!to.isAdded()) {    //       add 
                ft.hide(from).add(R.id.frame_main, to).commit(); //      fragment,add    Activity 
            } else {
                ft.hide(from).show(to).commit(); //      fragment,     
            }
        }
    }

最後の結果は次の図です.