android Setting模块简介

Setting模块简介

一、Settings涉及的模块

         4.0设置的layout有很大的改变。将设置分为四个部分:

         WIRELESS & NETWORKS:SIM卡管理,流量使用情况,飞行模式,VPN,网络共享等

         DEVICE :情景模式,显示,存储,电池,应用程序

         PERSONAL: 账户与同步,位置服务,安全,语言和输入法,备份和重置

         SYSTEM: 日期和时间,定时开关及,辅助功能,开发人员选项,关于手机

二、Settings部分的Fragment

        public class Settings extends PreferenceActivity{}。因为从3.0中就引入了Fragment机制,所以在Settings里面就只有这一个Acitivity类,而进入里表中的某项设置后,不是进入到新的Activity,而是在原来的Activity上切换了一个UI界面而已。Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容,对不同的界面不再使用不同的Activity。将这些UI面板模块化以便提供给其它Acitivity使用。当然显示的Fragment也会受到当前 Acitivity生命周期影响,而平常的Fragment页有其自己的生命周期。Setting模块典型的使用这个方法,它定义很多独立的fragment然后将这些fragment纳入到SubSettings.java activity中,这样可将要展示的fragment像调用Activity那样般调用。

三、Setting界面的加载

   1.继承关系

Settings.java 是继承PreferenceActivity.java,而referenceActivity.java是继承ListActivity-->Activity

   2. 界面加载

1)加载界面对应的Fragment

a. 实现onBuildHeaders()回调用来指定头文件
调用loadHeadersFromResource()方法对界面进行加载

方法实现:

    @Override

    public void onBuildHeaders(List<Header> headers) {//fengyaing  11

             loadHeadersFromResource(R.xml.settings_headers, headers); //加载header文件

        updateHeaderList(headers);//显示列表项删选

}
    b. header放入listview

@Override

public void setListAdapter(ListAdapter adapter) {

        if (adapter == null) {

            super.setListAdapter(null);

        } else {

   super.setListAdapter(new HeaderAdapter(this, getHeaders(), mAuthenticatorHelper));//

        }

    }

c. Settings.java的内部类HeaderAdapter 类介绍

    private static class HeaderAdapter extends ArrayAdapter<Header> {

        static final int HEADER_TYPE_CATEGORY = 0;

       static final int HEADER_TYPE_NORMAL = 1;

       static final int HEADER_TYPE_SWITCH = 2;

       @Override

    public View getView(int position, View convertView, ViewGroup parent) {//加载header列表

            HeaderViewHolder holder;

            Header header = getItem(position);

            int headerType = getHeaderType(header);

            View view = null;

            if (convertView == null) {

                holder = new HeaderViewHolder();

                switch (headerType) {

                    case HEADER_TYPE_CATEGORY:

                        view = new TextView(getContext(), null,

                                android.R.attr.listSeparatorTextViewStyle);

                        holder.title = (TextView) view;

                        break;

                    case HEADER_TYPE_SWITCH:

                        view = mInflater.inflate(R.layout.preference_header_switch_item, parent,

                                false);

                        holder.icon = (ImageView) view.findViewById(R.id.icon);

                        holder.title = (TextView)

                                view.findViewById(com.android.internal.R.id.title);

                        holder.summary = (TextView)

                                view.findViewById(com.android.internal.R.id.summary);

                        holder.switch_ = (Switch) view.findViewById(R.id.switchWidget);

                        break;

                    case HEADER_TYPE_NORMAL:

                        view = mInflater.inflate(

                                R.layout.preference_header_item, parent,

                                false);

                        holder.icon = (ImageView) view.findViewById(R.id.icon);

                        holder.title = (TextView)

                                view.findViewById(com.android.internal.R.id.title);

                        holder.summary = (TextView)

                                view.findViewById(com.android.internal.R.id.summary);

                        break;

                }

                view.setTag(holder);

            } else {

                view = convertView;

                holder = (HeaderViewHolder) view.getTag();

            }

            // All view fields must be updated every time, because the view may be recycled

            switch (headerType) {

                case HEADER_TYPE_CATEGORY:

                    holder.title.setText(header.getTitle(getContext().getResources()));

                    break;

                case HEADER_TYPE_SWITCH:

                    // Would need a different treatment if the main menu had more switches

                    if (header.id == R.id.wifi_settings) {

                        mWifiEnabler.setSwitch(holder.switch_);

                    } else {

                        mBluetoothEnabler.setSwitch(holder.switch_);

                    }

                    // No break, fall through on purpose to update common fields

                    //$FALL-THROUGH$

                case HEADER_TYPE_NORMAL:

                    if (header.extras != null

                            && header.extras.containsKey(ManageAccountsSettings.KEY_ACCOUNT_TYPE)) {

                        String accType = header.extras.getString(

                                ManageAccountsSettings.KEY_ACCOUNT_TYPE);

                        ViewGroup.LayoutParams lp = holder.icon.getLayoutParams();

                        lp.width = getContext().getResources().getDimensionPixelSize(

                                R.dimen.header_icon_width);

                        lp.height = lp.width;

                        holder.icon.setLayoutParams(lp);

                        Drawable icon = mAuthHelper.getDrawableForType(getContext(), accType);

                        holder.icon.setImageDrawable(icon);

                    } else {

                        holder.icon.setImageResource(header.iconRes);

                    }

                    holder.title.setText(header.getTitle(getContext().getResources()));

                    CharSequence summary = header.getSummary(getContext().getResources());

                    if (!TextUtils.isEmpty(summary)) {

                        holder.summary.setVisibility(View.VISIBLE);

                        holder.summary.setText(summary);

                    } else {

                        holder.summary.setVisibility(View.GONE);

                    }

                    break;

            }

            // /M: add for sim management feature

            if (header.id == R.id.sim_settings) {

                handleDisableHolder(holder, view);

            } else {

                handleEnableHolder(holder, view);

            }

            return view;

        }}

类的开头就定义了三个常量:这个代表Header的三种类型:
HEADER_TYPE_CATEGORY代表一个分类,它不能点击
HEADER_TYPE_NORMAL代表一个常规项
HEADER_TYPE_SWITCH代表一种开头形式的类型

getView()方法中也是根据三种不同的类型,加载不同的view以及数据,这时Seting类的界面就显示出来。

3.点击事件

1) header的点击事件触发

看onHeaderClick()方法

@Override

    public void onHeaderClick(Header header, int position) {

        boolean revert = false;

        if (header.id == R.id.account_add) {

            revert = true;

        }

        super.onHeaderClick(header, position);//调用父类的方法响应点击事件

        if (revert && mLastHeader != null) {

            highlightHeader((int) mLastHeader.id);

        } else {

            mLastHeader = header;

        }

}    

2)将fragment包裹到继承了Settings.java的SubSettings.java中

@Override

    public Intent onBuildStartFragmentIntent(String fragmentName, Bundle args,

            int titleRes, int shortTitleRes) {

        Intent intent = super.onBuildStartFragmentIntent(fragmentName, args,

                titleRes, shortTitleRes);//调用父类的方法将fragment包裹到activity中

         System.out.println("onBuildStartFragmentIntent3333:"+intent);

        // some fragments want to avoid split actionbar

        if (DataUsageSummary.class.getName().equals(fragmentName) ||

                PowerUsageSummary.class.getName().equals(fragmentName) ||

                AccountSyncSettings.class.getName().equals(fragmentName) ||

                UserDictionarySettings.class.getName().equals(fragmentName) ||

                Memory.class.getName().equals(fragmentName) ||

                ManageApplications.class.getName().equals(fragmentName) ||

                WirelessSettings.class.getName().equals(fragmentName) ||

                PrivacySettings.class.getName().equals(fragmentName) ||

                ManageAccountsSettings.class.getName().equals(fragmentName)) {

            intent.putExtra(EXTRA_CLEAR_UI_OPTIONS, true);

        }

        intent.setClass(this, SubSettings.class);

        return intent;

    }

 

 

 

要将Android 11中的Setting应用进行移植,需要进行以下步骤: 1. 环境搭建:首先,需要确保开发环境正常搭建。安装并配置Android开发工具包(Android SDK),确保其包含最新的Android 11版本。此外,还需要安装适当的IDE,如Android Studio。 2. 代码下载:从Android官方源代码库中下载Android 11的源代码。这可以通过使用repo命令进行操作,repo是一个Git的扩展工具,可以帮助下载和管理多个Git仓库。 3. 源码编译:使用Android Studio或者命令行编译源代码。首先,需要根据设备类型选择合适的编译目标,如手机、平板电脑或虚拟设备。然后,执行编译命令,等待编译完成。 4. 移植Setting应用:从源代码中找到Setting应用的模块,并将其添加到新的工程或现有的工程中,确保与其他组件的兼容性。此外,还需要处理任何依赖关系,包括设置权限、相关库和资源文件等。 5. 定制和适应性修改:对Setting应用根据需求进行定制和适应性修改。根据目标设备和用户需求,可能需要进行界面布局的改变、功能增加或删减等。这意味着需要进行开发和测试工作,确保移植后的Setting应用满足特定需求。 6. 测试和调试:在真实设备或虚拟设备上进行完整的测试和调试。确保Setting应用的正常运行,并修复任何出现的错误或问题。这包括对界面交互、数据存储、权限等方面进行测试。 7. 发布和部署:完成移植后的Setting应用的最终测试和调试后,可以将其打包并发布到目标设备上。可以通过应用商店、自动化部署或其他适当的方法进行部署。 总结起来,移植Android 11的Setting应用需要进行环境搭建、代码下载、源码编译、应用移植、定制和适应性修改、测试和调试、发布和部署等一系列步骤。这些步骤需要开发人员具备相关的开发和调试经验,并且需要根据特定的设备和用户需求进行定制和修改。移植完成后,需要进行充分的测试和调试,确保应用在目标设备上的正确运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值