Android: Start Activity from preferences.xml

匿名 (未验证) 提交于 2019-12-03 02:14:01

问题:

I would like to start an Activity from a default preferences.xml, with < intent > tag. The Activities are well tested, the problem is not with that. (I'm extending PreferenceActivity in my app, so the preferences.xml is "comes" with that) Please look at the code, what's wrong?

preferences.xml:

....  <PreferenceCategory      android:title="@string/titleEtcSetup">     <PreferenceScreen         android:key="renameCourses"         android:title="@string/titleRenameCourses"         android:summary="@string/textRenameDisplayedCoursesNames">         <intent              android:action="android.intent.action.VIEW"              android:targetPackage="my.notifier.ui"              android:targetClass="my.notifier.ui.EditCoursesNamesActivity" />              </PreferenceScreen> ..... </PreferenceCategory> .....  

manifest.xml:

.... <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.notifier.ui".... .... <activity android:name=".EditCoursesNamesActivity" android:label="@string/titleRenameCourses">         <intent-filter>             <action android:name="android.intent.action.VIEW" />             <category android:name="android.intent.category.DEFAULT" />         </intent-filter>     </activity>  ..... 

The Activity isn't calling when I press the "renameCourses item", nothing happens. The LogCat is "clear", no errors or warnings. I was searching a lot, and I didn't find a solution, maybe I just missed something... Please help!

回答1:

I was having the same issue. I got this working by only declaring the action in my AndroidManifest.xml, as such:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"       package="com.example.myapp" android:versionName="1.3" android:versionCode="4">  ...      <activity android:name=".activities.MyActivity"                android:label="@string/my_activity_title"               android:theme="@android:style/Theme.Black.NoTitleBar">         <intent-filter>            <action android:name="com.example.myapp.activities.MyActivity" />            <category android:name="android.intent.category.DEFAULT" />        </intent-filter>     </activity> 

Then in my Preferences xml file:

<PreferenceCategory         android:title="@string/my_activity_title">     <PreferenceScreen         android:title="@string/my_activity_title"          android:summary="@string/my_activity_title">         <intent android:action="com.example.myapp.activities.MyActivity"/>     </PreferenceScreen> </PreferenceCategory> 


回答2:

I believe <intent> tag must be inside <Preference>, not <PreferenceScreen>.

<PreferenceCategory      android:title="@string/titleEtcSetup">     <Preference         android:key="renameCourses"         android:title="@string/titleRenameCourses"         android:summary="@string/textRenameDisplayedCoursesNames">         <intent              android:action="android.intent.action.VIEW"              android:targetPackage="my.notifier.ui"              android:targetClass="my.notifier.ui.EditCoursesNamesActivity" />              </Preference> ..... </PreferenceCategory> 


回答3:

Caution! The value of targetPackage should be the package id of the app, as declared in the root element of your AndroidManifest.xml file (which you define in your Gradle build file). It is not necessary the same as the Java package of your Activity class (people usually put them in a subpackage of "ui").

So in your specific case, I bet you the targetPackage should be "my.notifier", not "my.notifier.ui" (I would have to see the manifest to be sure).



回答4:

No need to add IntentFilter. You can refer to activity by fully qualified name:

<intent android:targetPackage="my.notifier.ui"     android:targetClass="my.notifier.ui.EditCoursesNamesActivity"/> 


回答5:

When I had this problem it was because I had made a sub-package for my activities. When I moved it into the root package the Preference screen could launch it.



回答6:

I was able to fix this by changing the category in the intent filter from

android.intent.category.DEFAULT

to

android.intent.category.PREFERENCE

http://developer.android.com/reference/android/content/Intent.html#CATEGORY_PREFERENCE

<activity   android:name=".ui.DatapackSelectionActivity"   android:label="@string/app_name"   android:screenOrientation="portrait"   android:theme="@android:style/Theme.NoTitleBar" >     <intent-filter>         <action android:name="android.intent.action.VIEW" />         <category android:name="android.intent.category.PREFERENCE" />     </intent-filter> </activity> 

I guess if you want your action to be even more specific just remove the whole category node

<activity   android:name=".ui.DatapackSelectionActivity"   android:label="@string/app_name"   android:screenOrientation="portrait"   android:theme="@android:style/Theme.NoTitleBar" >     <intent-filter>         <action android:name="android.intent.action.VIEW" />     </intent-filter> </activity> 


回答7:

This solution shows you how to wire in an activity into your preferences headers.

First, your target activity must be declared in the manifest like this:

<activity android:name=".ui.activities.MyActivity">     <intent-filter>         <action android:name=".ui.activities.MyActivity" />         <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 

Notice here that the android:name for the activity and action are the same.

Now in your preferences.xml file you need only to declare a header like this:

<header     android:title="@string/my_activity_title"     android:summary="@string/my_activity_summary">     <intent android:action=".ui.activities.MyActivity"/> </header> 

And that's all there is to it.



回答8:

targetPackage and targetClass(prefix) may differ because of refactoring package name. Easy way to check it you can delete activity in manifest and call startActivity() then you will see this error in logCat: "Unable to find explicit activity class {'targetPackage'/'targetClass'}". Those are the right names you should write into Preference>intent. Intent-filter is not needed.



回答9:

I was having the same issue. and solve by this

androidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"           package="com.example.coding1.myapp"> <application         android:allowBackup="true"         android:icon="@mipmap/ic_launcher"         android:label="@string/app_name"         android:theme="@style/AppTheme">          <activity             android:name=".MainActivity"             android:label="@string/app_name"             >              <intent-filter>                 <action android:name="android.intent.action.MAIN" />                 <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity> // ==================== HERE ================================         <activity             android:name="yaran.AccountWorker.AuthenticatorActivity"             android:label="@string/app_name"             >             <intent-filter>                 <action android:name="AuthenticatorActivity" />                 <category android:name="android.intent.category.DEFAULT" />             </intent-filter>         </activity> // ========================================================         <service android:name="yaran.AccountWorker.AuthenticatorService" android:exported="false"  android:process=":auth">             <intent-filter>                 <action android:name="android.accounts.AccountAuthenticator" />             </intent-filter>             <meta-data android:name="android.accounts.AccountAuthenticator"                        android:resource="@xml/authenticator" />         </service>     </application> 

and in Preference:

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">      <PreferenceCategory         android:title="General Settings" />      <Preference         android:key="account_settings"         android:title="Account Settings"         android:summary="">         <intent             android:action="AuthenticatorActivity"             android:targetPackage="com.example.coding1.myapp"             android:targetClass="yaran.AccountWorker.AuthenticatorActivity" />     </Preference> </PreferenceScreen> 


回答10:

I solved the same issue by declaring the <intent-filter> in the manifest as follows:

<activity     android:name="PeriodosActivity"     android:label="Periodos"     android:screenOrientation="portrait">      <intent-filter>         <action android:name="Periodos" /> /*Same as in the preference's <intent> element's action attribute*/         <category android:name="android.intent.category.DEFAULT"/>  </intent-filter> 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!