這個界面是Catpel的主界面的側(cè)邊欄,點擊側(cè)邊爛中的應(yīng)用列表可以跳轉(zhuǎn)到對應(yīng)的應(yīng)用套像。
關(guān)于獲取手機上安裝的應(yīng)用和一些服務(wù)可以看看
獲取手機中安裝的應(yīng)用
這里的原理比較簡單:
重點代碼在這兩句:
BannedAppInfo infos = new BannedAppInfo(pinfo.applicationInfo.loadIcon(packageManager), name);
infos.appIntent = packageManager.
getLaunchIntentForPackage(pinfo.packageName);
我自己創(chuàng)建了一個類BannedAppInfo
用于保存從Packagemanager提取出來的App的相關(guān)信息酿联,其中的appIntent
是一個Intent類的public對象,省去了寫getter和setter的麻煩夺巩。
開始的時候我寫了一個類App繼承于Application贞让,這樣的話作為整個應(yīng)用的全局變量,在選擇應(yīng)用黑名單的時候同時也把一個名單放到了這個全局變量里面去了柳譬。 之后從這個名單之中提取出來相應(yīng)的Intent對象震桶,執(zhí)行````startActivity(infos.intent)```就可以。
下面說一下如何動態(tài)去加載NavigationView中的組件
1)Header
就拿Android Studio 自動生成的帶有側(cè)邊欄的App來說征绎,在布局文件中有關(guān)于NavigationView的有兩份重要的布局(默認(rèn)情況)
1.---content_main
這個是沒有拉開側(cè)邊欄的時候用戶第一眼看到的那個布局,這個布局被<include>到了app_bar_main
之中磨取,然后app_bar_main
再被activity_main
include人柿。
2.---nav_header_main
這里的內(nèi)容是才是側(cè)邊欄中header的內(nèi)容,比如常見到的qq中的用戶頭像之類忙厌。
可能會去動態(tài)更改Header中內(nèi)容的嘗試:
1.如果在MainActivity中直接去findViewById 在nav_header_main
中的控件對象的實例凫岖,匯報空指針,因為content_main
之中并沒有這個對象逢净。
2.使用LayoutInflater
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View view = getLayoutInflater().inflate(R.layout.nav_header_main,
null);
TextView username = view.findViewById(R.id.content_username);
username.setText("here we are");
inflate()有兩個參數(shù) 一個參數(shù)是制定需要實例化的這個View 另外一個參數(shù)當(dāng)指定為空的時候哥放,將默認(rèn)的layout作為view的根歼指。
但是無論設(shè)置第二個參數(shù)空還是飛空都沒有辦法解決設(shè)置的問題。
(這里請知道原因的大神評論告訴我)
3.解決方法
NavigationView navigationView =
(NavigationView) findViewById(R.id.nav_view);
View view = navigationView.getHeaderView(0);
getHeaderView的參數(shù)只有一個就是index甥雕,這里制定為0踩身,之后再進行動態(tài)設(shè)置就不成問題了。
2)Menu
動態(tài)設(shè)置Menu的方法可用以下方法解決:
getMenu().add().setIcon()
設(shè)置監(jiān)聽的話:
setOnMenuItemClickListener
這里的setIcon()
的參數(shù)是int id所以需要R...這種類型的文件