• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Android11 Launcher添加网格布局设置3x3,4x4,5x5

武飞扬头像
framework-coder
帮助1

需求:长按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
系列文章
更多 icon
同类精品
更多 icon
继续加载