android修改app图标 app系统菜单 图标动态改变,怎么判断当前是哪个图标?

android动态改变桌面图标
在我们的使用Android系统时,经常能看到很多图标上线会标有一些数字,比如短信数量,邮件数量等等,这很好奇, 这是怎么实现的呢?且他会根据实际情况不断的变化,很是神奇呀,默认Android是不支持的,那我们今天就来慢慢的讲讲,他是怎么实现的。
今天介绍两种方法,一种是应用快捷方式, 第二种是修改Iauncher 代码来达到动态icon的效果,配合其他应用来实现。
在应用中发现,普通的应用都可以,这就更神奇了,比如豌豆荚,它会提示你有几个应用要升级,很好奇,研究了一番,发现他是有两个应用图标,我们知道应用程序真正的只有一个图标的,那另外一个是什么呢?对啦,是应用程序的快捷方式,他可以创建多个或者一个,那我们就找到了今天的第一种方法去实现它啦。
第一种就是就是很简单的,我们进行变通,可以使用桌面程序创建的快捷方式去实现这个,当我们的应用程序数据变化改变的时候就重新安装 一个新的快捷方式,且它上面标识着我们的一些数据,这样就实现了以假乱真的情况。
和IOS开发和Windows Phone开发相比,Android是开放的,Android上的开发也相对更加灵活,能够做很多事情。有的朋友会发现,在某些Android应用安装以后,第一次运行,就会在桌面创建快捷方式。这是如何做到的呢?
要不怎么说Android特别开放呢,在Android开发中,只要发送一个广播,就可以实现这种需求了。
废话不多说,以下是封装好的一段代码。
代码比较简单,不做更详细的解释。
别忘记增加以下权限,否则看不到任何效果。
&uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/&
另外,这样做可能并不友好。更好的做法是,第一次运行程序的时候,提示用户是否创建桌面快捷方式,让用户选择。以后再次运行就不再进行提示了。
第二种方式就是修改launcher的代码,然后配合其他的应用来实现动态icon 的效果,在实现它之前,先要大致了解在launcher在应用安装,卸载,更新的时候是怎么做的,这里大概介绍下,在应用安装,更新,卸载的时候,都会有广播发出,launcher在LauncherApplication 中注册广播,在LauncherModel中处理接收到广播的消息,广播带的参数为应用包的数组,然后在一个线程Task中去重新加载更新这几个包相应的内容,比如icon,文字等,那么我就可以模拟这样的效果,在application中也注册一个广播,比如appchanged
等然后在Launchermodel中处理,处理可以模拟应用更新的部分,进行一个线程处理,最主要的是在Launcher allApp 界面的图标怎么变,我们发现Launcher中的文字和图标在PagedViewIcon 这个类里面生成的,它实际是一个Textview,只是进行了重写,添加了相关的属性,图标是在这个方法setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null); 中设置的,这个在很多的view中都有这个方法。他可以设置控件上下左右的图标,Launcher
allApp 界面的图标就是用TextView 设置的图片,所以在这里可以根据应用程序的包名然后进行一些特殊的属性进行判断,然后设置显示不同的图标,对于图标的大小我们可以使用Utilities 类的createIconBitmap 方法适配Launcher 中图标。在别的应用程序中发送appchanged广播,并带上包名参数,当达到pagedViewIcon 中指定的条件,设置指定的图片,就可以实现动态的变化了,这个依赖外来程序的广播,这样就可以实现动态icon了。
Android动态改变App在Launcher里面的icon
动态切换App桌面icon跟text,让你的应用炫起来(Android)!!
修改桌面图标大小
android学习历程——如何修改程序在桌面的图标和名字
android去掉Launcher界面图标显示
Android 动态替换桌面图标
Android桌面小图标终极解决方案
在Android中修改快捷方式的图标
没有更多推荐了,就是这里,怎样才能在代码中动态改变这里的图标。比如我得到了某种状态,我想给图标换个颜色。onPrepareOptionsMenu这个函数,我试了试,即使按物理按键,对ActionBar上的menu似乎不起作用,那如何才能改变呢?
或者,如何才能在代码中获取在
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
这里加载过的menu呢?
补充说明:
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem menuItem = menu.findItem(R.id.create_connection);
if (isCreateConnectionSuccess) {
menuItem.setIcon(R.drawable.apps_bright);
menuItem.setTitle("改变过");
这段代码我试过,但是ActionBar是个神奇的东西,它只改变了Title,而Icon却没改变。我猜原因可能是因为ActionBar上的Menu一直显示,所以对它没有&显示前&?
该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
actionbar还没有用过,不过你说的这个onCreateOptionsMenu方法是不能动态加载菜单的,因为他只调用了一次,你可以换onPrepareOptionsMenu这个方法来获取,他每次点击菜单都会调用。1.public boolean onCreateOptionsMenu(Menu menu)此方法用于初始化菜单,其中menu参数就是即将要显示的Menu实例。返回true则显示该menu,false 则不显示;(只会在第一次初始化菜单时调用)
2.public boolean onPrepareOptionsMenu(Menu menu)在onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。同样的, 返回true则显示该menu,false 则不显示;(可以通过此方法动态的改变菜单的状态,比如加载不同的菜单等)
在上面的2种方法中添加菜单的方式是:menu.add((int groupId, int itemId, int order, charsequence title) .setIcon(drawable ID)
add()方法的四个参数,依次是:
1、组别,如果不分组的话就写Menu.NONE,
2、Id,这个很重要,Android根据这个Id来确定不同的菜单
3、顺序,哪个菜单项在前面由这个参数的大小决定
4、文本,菜单项的显示文本
在onPrepareOptionsMenu你就可以动态的判断各种状态并添加菜单了。
mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
ActionBarSherlock
invalidateOptionsMenu();
说下我的解决办法吧,直接得到Activity的ActionBar 在ActionBar 中加载新的视图就可以改变Menu的样式和效果了。PS:为了兼容低版本我使用的是开源的ActionBarSherlock而非原生的action bar,不过代码类似。
public void onResume() {
ActionBar myActionBar = getSherlockActivity().getSupportActionBar();
myActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
LayoutInflater inflater = LayoutInflater.from(getSherlockActivity());
View view = inflater.inflate(R.layout.actionbar_layout, null);
myActionBar.setCustomView(view);
super.onResume();
突然发现原来还有这种好 东西,以前都是 Custom title 然后手写 xml 才搞出的效果虽然麻烦了点,但是完全可以自己控制
刚看了看 google dev guide 貌似也是静态的,不能换
不是您所需,查看更多相关问题与答案
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (35657) 次河山大好、微分不燥
Android动态更换APP图标及名称
本来想研究一加手机上的天气APP,会随着每天的天气、温度不同动态的改变APP的图标是如何实现的,但始终没有想出和查阅到相关方法,毕竟是人家自己的系统APP。但是也找到了一种能动态改变图标的方法,这里做一下简单的记录。
这里点击完“改变图标”后,桌面上的APP图标不会立即改变,会有一定的延迟,需要等待Launcher刷新。
多入口配置:activity-alias
alias是别名的意思,顾名思义,就是可以给Activity配置别名。在AndroidManifest.xml中,与基本的Activity的配置大体相似,如:
android:name=".MainActivity"
android:label="改变前的"&
android:name="android.intent.action.MAIN" /&
android:name="android.intent.category.LAUNCHER" /&
android:name=".test"
android:enabled="false"
android:icon="@mipmap/icon_test"
android:label="改变后的"
android:targetActivity=".MainActivity"&
android:name="android.intent.action.MAIN" /&
android:name="android.intent.category.LAUNCHER" /&
上面的默认的,下面的是配置的别名,也就是另一个入口。
android:name:就是注册这个组件的名字,不需要去创建test.java这个类,就是个名字,我这里的这个名称是,com.fu.changeicondemo.test
android:enabled:是否启用这个组件,也就是是否显示这个入口。
android:icon:图标
android:label:名称
android:targetActivity:这个需要注意,默认的activity没有这个属性,这个属性就是指定目标activity,与默认的activity中的name属性是一样的,需要有相应的java类文件。
然后intent-filter是一样的。
我们把别名activity的android:enabled设为true,就是开启它,桌面上就有两个入口了。
点击这两个图标效果是一样的,都是进入MainActivity。
讲到这里,相信读者应该已经明白了,如何动态改变图标了,其实就启用不同的入口就行,然后每次就只有一个入口被启用就行了,在默认情况下,我们就让启动的默认组件,其他入口组件全部禁用,需要用哪个就启用哪个,并且把其他的关闭了,避免出现多个入口,那么如何通过代码动态的设置启动或禁用呢?
如何动态设置是否启用?
那就需要packageManager,有一个这个方法:
packageManager.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP)
第一个参数是组件,第二个参数就是是否启用,第三个参数一般就填不杀死APP。
然后组件通过自己定义的组件名字来获取到,如
defaultComponent = new ComponentName(getBaseContext(), "com.fu.changeicondemo.MainActivity");
testComponent = new ComponentName(getBaseContext(), "com.fu.changeicondemo.test");
到了这里,相信大家已经很清楚了如何实现了,下面附上代码。
MainActivity.java
public class MainActivity extends AppCompatActivity {
private ComponentName defaultC
private ComponentName testC
private PackageManager packageM
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ComponentName componentName = getComponentName();
defaultComponent = new ComponentName(getBaseContext(), "com.fu.changeicondemo.MainActivity");
testComponent = new ComponentName(getBaseContext(), "com.fu.changeicondemo.test");
packageManager = getApplicationContext().getPackageManager();
public void changeIcon(View view) {
disableComponent(defaultComponent);
enableComponent(testComponent);
public void changeDefaultIcon(View view) {
enableComponent(defaultComponent);
disableComponent(testComponent);
* 启用组件
* componentName
private void enableComponent(ComponentName componentName) {
int state = packageManager.getComponentEnabledSetting(componentName);
if (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
packageManager.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
* 禁用组件
* componentName
private void disableComponent(ComponentName componentName) {
int state = packageManager.getComponentEnabledSetting(componentName);
if (state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
packageManager.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
activity_main.xml
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.fu.changeicondemo.MainActivity"&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="改变图标"
android:onClick="changeIcon"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="改回默认图标"
android:onClick="changeDefaultIcon" /&
AndroidManifest.xml
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fu.changeicondemo"&
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"&
android:name=".MainActivity"
android:label="改变前的"&
android:name="android.intent.action.MAIN" /&
android:name="android.intent.category.LAUNCHER" /&
android:name=".test"
android:enabled="false"
android:icon="@mipmap/icon_test"
android:label="改变后的"
android:targetActivity=".MainActivity"&
android:name="android.intent.action.MAIN" /&
android:name="android.intent.category.LAUNCHER" /&
这个方法能动态改变图标和名称、但是需要提前把“坑位”站住,需要用哪个就用哪个。还有一个问题就是,在调用完相应的改变图标的方法时候需要等待Launcher刷新,而在这个时间里,在去点击图标就会提示“未安装该应用”。如图:
Android通过入口别名来动态修改icon
【Android】Android之修改app标题与图标
如何修改Android应用程序的图标和名字?
怎样动态更换APP图标
iOS APP更换应用图标logo
Android动态修改icon--让你的app浪起来
AndroidManifest.xml之动态修改应用的图标和应用名称
Android studio如何更改应用程序的图标以及名称
Android Studio App 图标更改 以及名称更改
没有更多推荐了,不写教程,只写奇技淫巧。
Toolbar菜单动态改变item的图标(二)
之前发过一篇关于Activity中的Toolbar在搭配Fragment使用的时候动态切换item图标的文章,但是随着学习的深入,需求的复杂,以前的那种解决方法在我看来已经越来越不适用了,于是我决定用新的方法解决这个问题,并写了这篇文章作为上一篇文章的补充,而上一篇文章我也将保留,作为我学习之路上的一个坑。
在之前的解决方法里,我们在初始化Activity的时候第一个Fragment也会初始化,所以我当时把第一个Fragment对应的Toolbar显示的标题以及菜单的图标都在Activity中做了初始化(Toolbar的title是在Activity的onCreate()方法中初始化,图标则是在Menu的布局文件中。),而当启动第二个Fragment覆盖了第一个Fragment之后,title和图标的改变我是通过onOptionsItemSelected(MenuItem item)方法来完成的。当最上层的第二个Fragment销毁的时候,title和图标又要返回与第一个Fragment相对应的状态,于是我监听了Menuitem的android.R.id.home的点击事件,在里面进行判断当前最顶层和用户交互的Fragment是谁,从而决定是销毁Fragment还是销毁Activity,以及更改Toolbar的title以及上面按钮的图标。详情可以参照我之前的那篇文章。
我现在发现,我这样写会导致代码异常杂乱,Toolbar显示信息的定义的相关代码到处都是,可读性极差,而且,每次启动新的Fragment的按钮并不一定都是Toolbar上面的,这样就导致,如果一个Activity如果出现三个或三个以上的Fragment的话,代码将会更混乱,甚至如果把代码交给第二个人将会变的完全不可读。今天我们就用一个新方法来解决这个问题。
首先,和之前一样,Activity中要设置一个状态变量status来表示当前和用户交互的是哪一个Fragment,每个Fragment用一个常量表示。然后,如果要Fragment拥有模拟返回栈的效果,就必须在把它添加到Activity中的时候有这样一行代码:
transaction.addToBackStack(null);
这行代码我之前也写了,但是完全没有发挥出它的作用。接着,只要你添加了这行代码,你就会发现,每次你点击back键,如果Activity中有好几个Fragment的话,就会一个一个的移除Fragment,直到第一个Fragment位于栈顶的时候再点back键才会销毁Activity,查阅资料我们直到,按下back键的时候,执行的方法不是finish(),而是onBackPress(),这个方法会判定处理Fragment的返回栈模拟的情况。于是,我们只需要在onOptionsItemSelected(MenuItem item)的android.R.id.home这个item的事件监听中调用onBackPress()方法,这样,Toolbar最左边的返回键也可以变得和back键一样。接着,我们要把所有修改Toolbar显示信息的代码集中到一起,这样易于阅读和管理。我们不再在onOptionsItemSelected(MenuItem item)中修改Toolbar,而是全部集中到onPrepareOptionsMenu(Menu menu)方法中,我们知道,只要重写这个方法,用本Activity的实例去调用invalidateOptionsMenu()这个方法,onPrepareOptionsMenu(Menu menu)方法就会被执行一次。这样的话,我们在每个和Activity相关联的Fragment中就必须得到一个Activity的实例,我们就可以这样写(假如Activity的名字叫做MainActivity):
MainActivity
mActivity = (MainActivity) getActivity();
这行代码可以写在Fragment的初始化的方法中,只要是在onStart()执行之前就可以。接着,我们要重写Fragment的onStart方法:
public void onStart() {
MainActivity.status = MainActivity.XXX
mActivity.invalidateOptionsMenu();
之所以写在onStart()方法里是因为,这样无论是添加一个Fragment,还是移除一个Fragment,都能让用户可见的Fragment执行这个方法从而修改Toolbar;
当然,onPrepareOptionsMenu(Menu menu)方法中有一个判定status值的语句,从而判定方法被执行时,它是在哪个Fragment中的onStart()被调用的,从而设置正确的Toolbar布局,以及Toolbar显示的title。
用了以上的这个方法后,无论Activity中有多少个Fragment,都能以简单易懂的方式,修改Toolbar,其实这个方法主要的核心就是:
1.Fragment返回栈模拟,以及onBackPress()方法的调用
2.利用onPrepareOptionsMenu(Menu menu)方法能在任何有Activity实例的地方调用的特点,将所有修改Toolbar的代码集中于此,而不要把他们散布到其他和Menu有关的回调方法中或者Activity以及Fragment生命周期的回调方法中,或是和添加以及移除Fragment有关的方法中。
3.在Fragment中获取和它关联的Activity的实例,并强制转型至那个具体的Activity类型,getActivity()只是返回最原始的Activity类型,这样会让你不能用这个实例调用你的Activity中的方法。
这篇文章就到这里,我只是大致简述了思想,但是没有像之前那篇文章一样写各种各样举例说明的代码,主要是,举例说明太占篇幅,而且不少地方和之前文章也有重复之处,本文作为之前的补充说明就不再大段举例了,相信大家能够读懂。
鉴于这个主题的第一篇文章完全是踩坑,而本文作为第二篇并没有一步接一步的详细教程,因此,等我有时间,我会再写最后一篇本主题的详细教程。
android自定义toolbar的menuItem图标大小
Toolbar动态改变menu
Android Toolbar菜单动态切换item的图标
Android ToolBar修改返回按钮图标
Android Toolbar使用系统原生返回键,并改变其颜色,自定义图片替换系统原生返回键
【踩坑】如何获得Toolbar上原生的返回按钮
ToolBar修改返回按钮图标
【Android开发】Toolbar与返回按钮
ToolBar左上角一个返回按钮的实现
Android动态修改ToolBar的Menu菜单
没有更多推荐了,android修改桌面app图标的问题。
[问题点数:40分,结帖人AA5279AA]
本版专家分:1841
2013年1月 Java大版内专家分月排行榜第一
2013年10月 Java大版内专家分月排行榜第二2013年3月 Java大版内专家分月排行榜第二2013年2月 Java大版内专家分月排行榜第二
2013年7月 Java大版内专家分月排行榜第三2013年5月 Java大版内专家分月排行榜第三2013年4月 Java大版内专家分月排行榜第三
结帖率 97.48%
CSDN今日推荐
本版专家分:845
本版专家分:1466
本版专家分:15
本版专家分:15
本版专家分:295
本版专家分:0
本版专家分:0
本版专家分:40
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:384
本版专家分:0
本版专家分:40
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:37
本版专家分:1841
2013年1月 Java大版内专家分月排行榜第一
2013年10月 Java大版内专家分月排行榜第二2013年3月 Java大版内专家分月排行榜第二2013年2月 Java大版内专家分月排行榜第二
2013年7月 Java大版内专家分月排行榜第三2013年5月 Java大版内专家分月排行榜第三2013年4月 Java大版内专家分月排行榜第三
本版专家分:120
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:5
本版专家分:0
本版专家分:0
匿名用户不能发表回复!|
其他相关推荐

我要回帖

更多关于 android隐藏app图标 的文章

 

随机推荐