Android13默认主屏幕

文章详细解析了Android12中如何通过APKSettings配置默认主屏幕应用,涉及DefaultHomeShortcutPreferenceController的处理逻辑和roles.xml文件的修改。介绍了从IntentACTION_MANAGE_DEFAULT_APP触发的追踪路径和config.xml中的新增字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:Android12 配置默认主屏幕 - 掘金 (juejin.cn)

作者:代码小偷
链接:https://juejin.cn/post/7272632260179787810
来源:稀土掘金

分析流程

APK Settings中的项目app下有对默认APP进行设置,如果没有手动设置默认的主屏幕APP选项一直为空。

DefaultHomeShortcutPreferenceController.java 为默认主屏幕选项控制器,其父类为DefaultAppShortcutPreferenceControllerBase.java,在父类中实现handlePreferenceTreeClick()方法,传入参数roleName = RoleManager.ROLE_HOME;

  public boolean handlePreferenceTreeClick(Preference preference) {
        if (!TextUtils.equals(mPreferenceKey, preference.getKey())) {
            return false;
        }
        final Intent intent = new Intent(Intent.ACTION_MANAGE_DEFAULT_APP)
                .putExtra(Intent.EXTRA_ROLE_NAME, mRoleName);
        mContext.startActivity(intent);
        return true;
    }

其中Intent.ACTION_MANAGE_DEFAULT_APP在Android\packages\modules\Permission\PermissionController中的DefaultAppActivity中接收,根据packagename进行追踪路径如下: DefaultAppActivity.java --->HandheldDefaultAppFragment.java --->DefaultAppChildFragment.java:setDefaultApp()---> ManageRoleHolderStateLiveData.java---> RoleService.java addRoleHolderAsUser()--->RoleControllerServiceImpl.java:onAddRoleHolder()--->RoleManager.java:addRoleHolderFromController()---> RoleService.java:addRoleHolderFromController()--->RoleUserState.java:addRoleHolder():readFile()--->RolesPersistenceImpl.java:ROLES_FILE_NAME = "roles.xml"

该XML位于Android\packages\modules\Permission\PermissionController\res\xml\roles.xml

修改内容

1.在该模块添加defaultHolders="config_defaultHome"

<role
    name="android.app.role.HOME"
    behavior="HomeRoleBehavior"
+++    defaultHolders="config_defaultHome"
    description="@string/role_home_description"
    exclusive="true"
    label="@string/role_home_label"
    overrideUserWhenGranting="true"
    requestDescription="@string/role_home_request_description"
    requestTitle="@string/role_home_request_title"
    searchKeywords="@string/role_home_search_keywords"
    shortLabel="@string/role_home_short_label">
......

2.在Android/frameworks/base/core/res/res/values/config.xml中添加字段:

 <string name="config_defaultHome" translatable="false">包名</string>

<think>好的,我现在要解决用户的问题:如何在Android中将Toast的默认显示位置设置为屏幕中间,并且需要自定义。根据用户提供的引用内容,我需要先理解现有的方法和可能的变化,尤其是在Android 11中的限制。 首先,用户提到在Android 11下,默认的Toast是文本Toast,自定义需要使用setView()方法[^1]。但可能有一些限制。另一个引用显示,可以通过Toast.makeText创建实例,并调整位置到中间[^2]。不过需要确认这些方法在较新版本中的适用性。 接下来,我需要考虑步骤。首先,传统的自定义Toast方法是否仍然有效?根据引用,自定义可能需要使用setView,但可能在Android 11及以上版本有变化。然后,设置位置通常使用setGravity方法,传入Gravity.CENTER。例如,创建Toast实例后调用setGravity。但需要检查是否有权限问题或系统限制。 可能存在的情况是,Android 11及以上版本禁止了自定义Toast的视图,因此传统方法可能失效。这时候可能需要寻找替代方案,比如使用Snackbar或者自定义的View添加到布局中。但用户明确希望使用Toast,所以需要验证是否在最新版本中还能使用setView。 根据引用,用户提供的代码示例是创建Toast并设置位置。这可能是在较低版本中的做法。如果setView在Android 11被限制,可能需要其他方法。例如,可能仍然可以设置gravity和偏移量来调整位置,即使不能自定义视图。 所以,解决方案可能分为两种情况:对于Android 11以下,可以使用自定义view并设置gravity;对于Android 11及以上,可能只能调整默认文本Toast的位置。需要测试这两种情况,并给出对应的代码示例。 另外,用户希望修改默认位置,可能需要封装一个工具类,每次显示Toast时自动设置位置到中间。这涉及到获取Toast实例,调用setGravity方法,并处理可能的版本差异。 总结步骤:检查Android版本,如果低于11,可以自定义view并居中;否则,使用默认Toast但调整位置。但根据引用,自定义Toast在Android 11可能不可行,所以可能需要使用setGravity方法作用于默认的文本Toast。测试发现,即使没有自定义view,setGravity可能仍然有效。 因此,可能的解决方案是创建Toast后,立即调用setGravity(Gravity.CENTER, 0, 0),然后显示。这样不需要自定义视图,可能绕过Android 11的限制。例如: Toast toast = Toast.makeText(context, text, duration); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); 需要验证这种方法在Android 11及以上是否有效。如果有效,这就是一个简单的解决方案。如果无效,可能需要其他方法,如使用Snackbar或自定义布局。 现在,根据用户提供的引用中的代码,他们确实是通过setGravity设置位置的,所以可能这种方法在大多数情况下有效,包括较新版本。因此,可以推荐这种方法作为解决方案,同时提醒用户注意Android 11的限制,如果自定义视图不可用,则仅调整位置可能仍然可行。 最后,封装工具类来统一处理,使得每次显示Toast时自动居中,这样可以简化调用。例如: public class ToastUtils { public static void showCenterToast(Context context, String message, int duration) { Toast toast = Toast.makeText(context, message, duration); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } } 总结:关键点在于使用setGravity方法,并避免在Android 11及以上使用被限制的自定义视图。如果用户仅需要调整位置而不需要修改视图,这种方法应该有效。</think>要将Android中的Toast默认显示位置设置为屏幕中间,可以通过以下步骤实现: ### 1. 使用`setGravity()`方法调整位置 在创建Toast对象后,调用`setGravity()`方法设置居中显示: ```java Toast toast = Toast.makeText(context, "内容", Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); // 第一个参数为位置,后两个是偏移量 toast.show(); ``` 此方法通过设置重力参数为`Gravity.CENTER`实现居中,无需自定义视图即可生效[^2]。 ### 2. 自定义Toast视图(注意Android 11限制) 对于需要自定义布局的情况: ```java Toast toast = new Toast(context); View view = LayoutInflater.from(context).inflate(R.layout.custom_toast, null); toast.setView(view); toast.setDuration(Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); ``` **注意**:Android 11及以上版本限制了自定义Toast视图,`setView()`可能失效。此时建议改用Snackbar或自定义窗口实现类似效果。 ### 3. 封装工具类简化调用 ```java public class ToastUtils { public static void showCenterToast(Context context, String text) { Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } } ``` ### 版本兼容建议 - 低于Android 11:可自由使用自定义视图 - Android 11+:优先使用系统默认Toast+位置调整 - 需要自定义样式时:改用Snackbar或PopupWindow
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值