Android:Jetpack Navigation DrawerMenu框架 界面間導(dǎo)航抽屜菜單

開始使用Navigation

demo:https://github.com/Gong-Shijie/navWithDrawer

應(yīng)用框架

Android studio直接創(chuàng)建

Google建議開發(fā)者只使用一個Activity搭配Fragment來架構(gòu)程序
可以直接new一個Navigation Drawer的項目


進一步調(diào)整為需要的效果


Drawer菜單

首先要了解菜單Menu患亿,菜單在Android部件系統(tǒng)中有三種類型

Drawer Menu

Toolbar菜單

底部菜單

對于這些菜單我們都可以通過他們來進行頁面導(dǎo)航切換
使用方法是直接在創(chuàng)建項目的時候使用提供的模板


根據(jù)這些默認模板可以減少項目構(gòu)建的封鎖步驟
viewmodel也可以勾選省去創(chuàng)建ViewModel步驟


創(chuàng)建一個Navigation Drawer 應(yīng)用

MainXML

重寫方法實現(xiàn)對所有菜單監(jiān)聽

處理toolbar菜單監(jiān)聽

  //只要是菜單選項被點擊都會調(diào)用該方法
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_settings:
               Toast.makeText(this, "Click !", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_settidfngs:
               Toast.makeText(this, "Click ! ", Toast.LENGTH_SHORT).show();
                break;

        }
        return super.onOptionsItemSelected(item);
    }

動態(tài)修改和設(shè)置抽屜菜單

drawer菜單

   //動態(tài)添加menuItem項設(shè)置id
        Menu menu = navigationView.getMenu();
        menu.clear();
        menu.add(0, R.id.nav_gallery, 0, "gallery").
setIcon(R.drawable.ic_menu_gallery);
        menu.add(0, R.id.nav_send, 1, "send").
setIcon(R.drawable.ic_menu_send);
//設(shè)置點擊監(jiān)聽但是不要消耗點擊事件否則影響導(dǎo)航
  menu.getItem(0).setOnMenuItemClickListener();

Navigation


主要代碼

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private AppBarConfiguration mAppBarConfiguration;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        //實現(xiàn)toolbar替換默認的Actionbar
        setSupportActionBar(toolbar);

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);


//將NavController 和app bar這種menu綁定從而實現(xiàn)Fragment切換的管理
//        也可以和其他的menu類型綁定
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                navController.getGraph()
        )
                .setDrawerLayout(drawer)
                .build();

        NavigationUI.setupActionBarWithNavController(this,
                navController, mAppBarConfiguration);

        //使得drawer顯示
        NavigationUI.setupWithNavController(navigationView,
                navController);

        //動態(tài)添加menuItem項設(shè)置id
        Menu menu = navigationView.getMenu();

        menu.clear();
        menu.add(0, R.id.nav_gallery, 0, "gallery").setIcon(R.drawable.ic_menu_gallery);
        menu.add(0, R.id.nav_send, 1, "send").setIcon(R.drawable.ic_menu_send);

    }

    //設(shè)置actionbar中的菜單顯示
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    //只要是菜單選項被點擊都會調(diào)用該方法
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_settings:
                Toast.makeText(this, "Click !", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_settidfngs:
                Toast.makeText(this, "Click ! ", Toast.LENGTH_SHORT).show();
                break;

        }
        return super.onOptionsItemSelected(item);
    }

    //處理左上角的菜單被點擊的時候的回調(diào)
    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this,
                R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</androidx.drawerlayout.widget.DrawerLayout>

HomeFragment.java

public class HomeFragment extends Fragment {

    private HomeViewModel homeViewModel;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        homeViewModel =
                new ViewModelProvider(requireActivity()).get(HomeViewModel.class);
        View root = inflater.inflate(R.layout.fragment_home, container, false);
        final TextView textView = root.findViewById(R.id.text_home);
        homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                textView.setText(s);
            }
        });
        return root;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寂纪,一起剝皮案震驚了整個濱河市拱燃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喝滞,老刑警劉巖粪糙,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件于未,死亡現(xiàn)場離奇詭異忿墅,居然都是意外死亡融求,警方通過查閱死者的電腦和手機咬像,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來生宛,“玉大人县昂,你說我怎么就攤上這事∠菥耍” “怎么了倒彰?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長莱睁。 經(jīng)常有香客問我待讳,道長,這世上最難降的妖魔是什么仰剿? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任创淡,我火速辦了婚禮,結(jié)果婚禮上南吮,老公的妹妹穿的比我還像新娘琳彩。我一直安慰自己,他們只是感情好部凑,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布露乏。 她就那樣靜靜地躺著,像睡著了一般砚尽。 火紅的嫁衣襯著肌膚如雪施无。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天必孤,我揣著相機與錄音猾骡,去河邊找鬼。 笑死敷搪,一個胖子當(dāng)著我的面吹牛兴想,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赡勘,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼嫂便,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闸与?” 一聲冷哼從身側(cè)響起毙替,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤岸售,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厂画,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凸丸,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年袱院,在試婚紗的時候發(fā)現(xiàn)自己被綠了屎慢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡忽洛,死狀恐怖腻惠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欲虚,我是刑警寧澤集灌,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站复哆,受9級特大地震影響绝页,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寂恬,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一续誉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧初肉,春花似錦酷鸦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妄壶,卻和暖如春摔握,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丁寄。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工氨淌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伊磺。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓盛正,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屑埋。 傳聞我的和親對象是個殘疾皇子豪筝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容