addPreferencesFromIntent 用法


当我们继承PreferenceFragment的时候我们经常调用这方法:

addPreferencesFromResource(R.xml.setting_preference);

因为最近的项目我都要把程序的资源文件都放到另一个apk中。而上面这个方法中只能传本地的或系统的资源id。那么我就找到了类似的方法:addPreferencesFromIntent(Intent intent);百度goolge了一下发现都是没有这个方法的例子只有搜索google的里面的api:

public void addPreferencesFromIntent (Intent intent)
Since:  API Level 1

This method is deprecated.
This function is not relevant for a modern fragment-based PreferenceActivity.

Adds preferences from activities that match the given Intent.

Parameters
intent The Intent to query activities.

这样介绍就很简单了,只是让我们去查询activities。没有说明xml是什么给的。没办法我只能去看源码,看他们是什么解析Intent的,那我就给出一个可用的intent。

因为是继承PreferenceFragment的,我就从源码找到frameworks/base/core/java/android/preference/PreferenceFragment.java这个类:


  public void addPreferencesFromIntent(Intent intent) {
        requirePreferenceManager();
        setPreferenceScreen(mPreferenceManager.inflateFromIntent(intent, getPreferenceScreen()));
    }
然后这里又用到了mPreferenceManager.inflateFromIntentt(intent, getPreferenceScreen()),那么在找到这个类frameworks/base/core/java/android/preference/PreferenceManager.java:

PreferenceScreen inflateFromIntent(Intent queryIntent, PreferenceScreen rootPreferences) {
        final List<ResolveInfo> activities = queryIntentActivities(queryIntent);
        final HashSet<String> inflatedRes = new HashSet<String>();

        for (int i = activities.size() - 1; i >= 0; i--) {
            final ActivityInfo activityInfo = activities.get(i).activityInfo;
            final Bundle metaData = activityInfo.metaData;

            if ((metaData == null) || !metaData.containsKey(METADATA_KEY_PREFERENCES)) {
                continue;
            }

            // Need to concat the package with res ID since the same res ID
            // can be re-used across contexts
            final String uniqueResId = activityInfo.packageName + ":"
                    + activityInfo.metaData.getInt(METADATA_KEY_PREFERENCES);

            if (!inflatedRes.contains(uniqueResId)) {
                inflatedRes.add(uniqueResId);

                final Context context;
                try {
                    context = mContext.createPackageContext(activityInfo.packageName, 0);
                } catch (NameNotFoundException e) {
                    Log.w(TAG, "Could not create context for " + activityInfo.packageName + ": "
                        + Log.getStackTraceString(e));
                    continue;
                }

                final PreferenceInflater inflater = new PreferenceInflater(context, this);
                final XmlResourceParser parser = activityInfo.loadXmlMetaData(context
                        .getPackageManager(), METADATA_KEY_PREFERENCES);
                rootPreferences = (PreferenceScreen) inflater
                        .inflate(parser, rootPreferences, true);
                parser.close();
            }
        }

        rootPreferences.onAttachedToHierarchy(this);

        return rootPreferences;
    }

从上面的代码我们就知道要从intent中获取一组activity。通过 activityInfo.metaData.getInt(METADATA_KEY_PREFERENCES)我们知道就是从activity拿的<meta-data 这些数据,那么我们在AndroidManifest.xml中eclipse提示的<meta-data只有三个属性:

     

那么我么就不难得出结论<meta-data 中的nane就是METADATA_KEY_PREFERENCES,而xml就是resource。

接下来还有一个问题就是METADATA_KEY_PREFERENCES的值是多少。搜一下在PreferenceManager.java中有如下定义:

 public static final String METADATA_KEY_PREFERENCES = "android.preference";

知道了以上原理我们来验证一下:

新建一个工程,在里面的activity标签中加<meta-data,如下:

<activity
            android:name="com.winca.style.defaultskin.RadioReadSettingXMLActivity"
            android:icon="@drawable/radio"
            android:label="@string/radio_app_name" >
            <meta-data android:name="android.preference"
                android:resource="@xml/setting_preference"/>
        </activity>

这个xml就是从我们程序中拷贝多来放到新建的工程中的。

原来我们工程用的addPreferencesFromResource(R.xml.setting_preference);这语句,我们这样替换:

Intent xmlIntent = new Intent();
		ComponentName component = new ComponentName("com.winca.style.defaultskin","com.winca.style.defaultskin.RadioReadSettingXMLActivity");
		xmlIntent.setComponent(component);
		addPreferencesFromIntent(xmlIntent);


 运行一下,正常显示xml里面的。成功调用。 







   


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值