android preferencescreen走哪个intent

 我来答
匿名用户
2017-05-02
展开全部
  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这个类:   view plaincopy to clipboardprint?   <span style="white-space:pre"> </span>public void addPreferencesFromIntent(Intent intent) { requirePreferenceManager(); setPreferenceScreen(mPreferenceManager.inflateFromIntent(intent, getPreferenceScreen())); }   <span style="white-space:pre"> </span>public void addPreferencesFromIntent(Intent intent) { requirePreferenceManager(); setPreferenceScreen(mPreferenceManager.inflateFromIntent(intent, getPreferenceScreen())); } 然后这里又用到了mPreferenceManager.inflateFromIntentt(intent, getPreferenceScreen()),那么在找到这个类frameworks/base/core/java/android/preference/PreferenceManager.java:   view plaincopy to clipboardprint?   <span style="white-space:pre"> </span>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; }   <span style="white-space:pre"> </span>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中有如下定义:   view plaincopy to clipboardprint?   public static final String METADATA_KEY_PREFERENCES = "android.preference";   public static final String METADATA_KEY_PREFERENCES = "android.preference"; 知道了以上原理我们来验证一下:   新建一个工程,在里面的activity标签中加<meta-data,如下:   view plaincopy to clipboardprint?   <span style="white-space:pre"> </span><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>   <span style="white-space:pre"> </span><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);这语句,我们这样替换:   view plaincopy to clipboardprint?   <pre name="code" class="java"><span style="white-space:pre"> </span>Intent xmlIntent = new Intent(); ComponentName component = new ComponentName("com.winca.style.defaultskin","com.winca.style.defaultskin.RadioReadSettingXMLActivity"); xmlIntent.setComponent(component); addPreferencesFromIntent(xmlIntent);   <pre name="code" class="java"><span style="white-space:pre"> </span>Intent xmlIntent = new Intent(); ComponentName component = new ComponentName("com.winca.style.defaultskin","com.winca.style.defaultskin.RadioReadSettingXMLActivity"); xmlIntent.setComponent(component); addPreferencesFromIntent(xmlIntent); 运行一下,正常显示xml里面的。问题解决。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式