这个界面是Catpel的主界面的侧边栏,点击侧边烂中的应用列表可以跳转到对应的应用。
关于获取手机上安装的应用和一些服务可以看看
获取手机中安装的应用
这里的原理比较简单:
重点代码在这两句:
BannedAppInfo infos = new BannedAppInfo(pinfo.applicationInfo.loadIcon(packageManager), name);
infos.appIntent = packageManager.
getLaunchIntentForPackage(pinfo.packageName);
我自己创建了一个类BannedAppInfo
用于保存从Packagemanager提取出来的App的相关信息,其中的appIntent
是一个Intent类的public对象,省去了写getter和setter的麻烦。
开始的时候我写了一个类App继承于Application,这样的话作为整个应用的全局变量,在选择应用黑名单的时候同时也把一个名单放到了这个全局变量里面去了。 之后从这个名单之中提取出来相应的Intent对象,执行````startActivity(infos.intent)```就可以。
下面说一下如何动态去加载NavigationView中的组件
1)Header
就拿Android Studio 自动生成的带有侧边栏的App来说,在布局文件中有关于NavigationView的有两份重要的布局(默认情况)
1.---content_main
这个是没有拉开侧边栏的时候用户第一眼看到的那个布局,这个布局被<include>到了app_bar_main
之中,然后app_bar_main
再被activity_main
include。
2.---nav_header_main
这里的内容是才是侧边栏中header的内容,比如常见到的qq中的用户头像之类。
可能会去动态更改Header中内容的尝试:
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()有两个参数 一个参数是制定需要实例化的这个View 另外一个参数当指定为空的时候,将默认的layout作为view的根。
但是无论设置第二个参数空还是飞空都没有办法解决设置的问题。
(这里请知道原因的大神评论告诉我)
3.解决方法
NavigationView navigationView =
(NavigationView) findViewById(R.id.nav_view);
View view = navigationView.getHeaderView(0);
getHeaderView的参数只有一个就是index,这里制定为0,之后再进行动态设置就不成问题了。
2)Menu
动态设置Menu的方法可用以下方法解决:
getMenu().add().setIcon()
设置监听的话:
setOnMenuItemClickListener
这里的setIcon()
的参数是int id所以需要R...这种类型的文件