Android11 Launcher添加网格布局设置3x3,4x4,5x5
需求:长按workspace空白处,Home Settings添加launcher界面布局3x3,4x4,5x5设置
添加布局文件,当网格设置关闭时,所有设置项置灰不允许点击
- 源码:/vendor/mediatek/proprietary/packages/apps/Launcher3/res/xml/launcher_preferences.xml
// add for grid options settings
<PreferenceCategory
android:key="grid_options_category"
android:order="100">
<SwitchPreference
android:key="pref_grid_options"
android:title="@string/grid_options"
android:defaultValue="false"
android:persistent="true" />
<CheckBoxPreference
android:dependency="pref_grid_options"
android:persistent="true"
android:key="3_by_3"
android:title="3x3" />
<CheckBoxPreference
android:dependency="pref_grid_options"
android:persistent="true"
android:key="4_by_4"
android:title="4x4" />
<CheckBoxPreference
android:dependency="pref_grid_options"
android:persistent="true"
android:key="5_by_5"
android:title="5x5" />
</PreferenceCategory>
// end
使能GridOptionsProvider
- 源码:/vendor/mediatek/proprietary/packages/apps/Launcher3/AndroidManifest-common.xml
<!--
The content provider for exposing various launcher grid options.
TODO: Add proper permissions
-->
<provider
android:name="com.android.launcher3.graphics.GridOptionsProvider"
android:authorities="${packageName}.grid_control"
android:exported="true"
android:enabled="true" />
Launcher布局切换设置功能
- 源码:/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/settings/SettingsActivity.java
import com.android.launcher3.util.SecureSettingsObserver;
// add for grid options settings
import com.android.launcher3.InvariantDeviceProfile;
import androidx.preference.CheckBoxPreference;
import android.content.Context;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.net.Uri;
// end
public class SettingsActivity extends FragmentActivity
implements OnPreferenceStartFragmentCallback, OnPreferenceStartScreenCallback,
SharedPreferences.OnSharedPreferenceChangeListener{
....
/**
* This fragment shows the launcher preferences.
*/
public static class LauncherSettingsFragment extends PreferenceFragmentCompat implements
Preference.OnPreferenceChangeListener{
// add for grid options settings
private InvariantDeviceProfile mInvariantDeviceProfile;
private static final String KEY_GRIDNAME_3X3 = "3_by_3";
private static final String KEY_GRIDNAME_4X4 = "4_by_4";
private static final String KEY_GRIDNAME_5X5 = "5_by_5";
private CheckBoxPreference checkbox3by3;
private CheckBoxPreference checkbox4by4;
private CheckBoxPreference checkbox5by5;
// end
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
final Bundle args = getArguments();
...
// add for grid options settings
initPreference();
// end
}
@Override
public void onResume() {
super.onResume();
if (isAdded() && !mPreferenceHighlighted) {
PreferenceHighlighter highlighter = createHighlighter();
if (highlighter != null) {
getView().postDelayed(highlighter, DELAY_HIGHLIGHT_DURATION_MILLIS);
mPreferenceHighlighted = true;
} else {
requestAccessibilityFocus(getListView());
}
}
// add for grid options settings
mInvariantDeviceProfile = InvariantDeviceProfile.INSTANCE.get(getContext());
updatePreference();
// end
}
// add for grid options settings
private void initPreference(){
checkbox3by3 = (CheckBoxPreference)findPreference(KEY_GRIDNAME_3X3);
checkbox3by3.setOnPreferenceChangeListener(this);
checkbox4by4 = (CheckBoxPreference)findPreference(KEY_GRIDNAME_4X4);
checkbox4by4.setOnPreferenceChangeListener(this);
checkbox5by5 = (CheckBoxPreference)findPreference(KEY_GRIDNAME_5X5);
checkbox5by5.setOnPreferenceChangeListener(this);
updatePreference();
}
private void updatePreference(){
String mGrigdName = mInvariantDeviceProfile.getCurrentGridName(getContext());
checkbox3by3.setChecked((mGrigdName.equals(KEY_GRIDNAME_3X3)) ? true : false);
checkbox4by4.setChecked((mGrigdName.equals(KEY_GRIDNAME_4X4)) ? true : false);
checkbox5by5.setChecked((mGrigdName.equals(KEY_GRIDNAME_5X5)) ? true : false);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
applyGrid(getContext(), key);
updatePreference();
return true;
}
public int applyGrid(Context context, String name) {
ContentValues values = new ContentValues();
values.put("name", name);
return context.getContentResolver().update(getUri(), values,
null, null);
}
public Uri getUri() {
return new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority("com.android.launcher3.grid_control")
.appendPath("default_grid")
.build();
}
// end
All APP中布局更新
- 源码:vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
private void refreshRecyclerView() {
if (mAdapter != null) {
// add for the layout of all apps is updated synchronously after the grid option is changed
mAdapter.setAppsPerRow(mLauncher.getDeviceProfile().inv.numAllAppsColumns);
//
mAdapter.notifyDataSetChanged();
}
}
设置3x3布局,前一屏没占满就创建下一屏
- vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/LoaderCursor.java
protected boolean checkItemPlacement(ItemInfo item) {
....
//去掉以下代码
/* if (!occupied.containsKey(item.screenId)) {
GridOccupancy screen = new GridOccupancy(countX 1, countY 1);
if (item.screenId == Workspace.FIRST_SCREEN_ID) {
// Mark the first row as occupied (if the feature is enabled)
// in order to account for the QSB.
screen.markCells(0, 0, countX 1, 1, FeatureFlags.QSB_ON_FIRST_SCREEN);
}
occupied.put(item.screenId, screen);
}*/
final GridOccupancy occupancy = occupied.get(item.screenId);
}
添加以上代码,launcher布局切换的功能基本实现
点击3x3,4x4等设置项后,会走GridOptionsProvider的update方法
- 源码:/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/graphics/GridOptionsProvider.java
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
if (!KEY_DEFAULT_GRID.equals(uri.getPath())) {
return 0;
}
String gridName = values.getAsString(KEY_NAME);
// Verify that this is a valid grid option
GridOption match = null;
for (GridOption option : parseAllGridOptions()) {
if (option.name.equals(gridName)) {
match = option;
break;
}
}
if (match == null) {
return 0;
}
InvariantDeviceProfile.INSTANCE.get(getContext()).setCurrentGrid(getContext(), gridName);
return 1;
}
然后会走到InvariantDeviceProfile的setCurrentGrid方法;下一步走到getPredefinedDeviceProfiles(Context context, String gridName)
static ArrayList<DisplayOption> getPredefinedDeviceProfiles(Context context, String gridName) {
ArrayList<DisplayOption> profiles = new ArrayList<>();
try (XmlResourceParser parser = context.getResources().getXml(R.xml.device_profiles)) {
final int depth = parser.getDepth();
int type;
while (((type = parser.next()) != XmlPullParser.END_TAG ||
parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
if ((type == XmlPullParser.START_TAG)
&& GridOption.TAG_NAME.equals(parser.getName())) {
GridOption gridOption = new GridOption(context, Xml.asAttributeSet(parser));
...
device_profiles
<profiles xmlns:launcher="http://schemas.android.com/apk/res-auto" >
<grid-option
launcher:name="3_by_3"
launcher:numRows="3"
launcher:numColumns="3"
launcher:numFolderRows="2"
launcher:numFolderColumns="3"
launcher:numHotseatIcons="3"
launcher:dbFile="launcher_3_by_3.db"
launcher:defaultLayoutId="@xml/default_workspace_3x3" >
<display-option
launcher:name="Super Short Stubby"
launcher:minWidthDps="255"
launcher:minHeightDps="300"
launcher:iconImageSize="48"
launcher:iconTextSize="13.0"
launcher:canBeDefault="true" />
<display-option
launcher:name="Shorter Stubby"
launcher:minWidthDps="255"
launcher:minHeightDps="400"
launcher:iconImageSize="48"
launcher:iconTextSize="13.0"
launcher:canBeDefault="true" />
</grid-option>
根据我们设置的grid_options名字匹配默认加载的布局文件
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfaghk
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01