<intent>タグを使用して、デフォルトのpreferences.xmlからアクティビティを開始したいと思います。アクティビティは十分にテストされていますが、問題はありません。 (私のアプリでPreferenceActivityを拡張しているので、preferences.xmlが "comes"になっています)コードを見てください、何が問題なのですか?
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>
.....
「renameCoursesアイテム」を押してもアクティビティが呼び出されないため、何も起こりません。 LogCatは「クリア」であり、エラーや警告はありません。私はよく検索していましたが、解決策を見つけられませんでした。
私は同じ問題を抱えていました。 AndroidManifest.xmlで次のようにアクションを宣言するだけで、これが機能します。
<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>
次に、Preferences xmlファイルで:
<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>
<intent>
タグは<Preference>
ではなく<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>
あぶない! targetPackage
の値は、AndroidManifest.xml
ファイル(Gradleビルドファイルで定義)のルート要素で宣言されているアプリのパッケージIDである必要があります。 ActivityクラスのJavaパッケージと同じである必要はありません(人々は通常、それらを"ui"
のサブパッケージに入れます)。
したがって、特定のケースでは、targetPackage
は"my.notifier"
ではなく"my.notifier.ui"
でなければなりません(確かにマニフェストを確認する必要があります)。
IntentFilterを追加する必要はありません。完全修飾名でアクティビティを参照できます。
<intent Android:targetPackage="my.notifier.ui"
Android:targetClass="my.notifier.ui.EditCoursesNamesActivity"/>
この問題が発生したのは、アクティビティのサブパッケージを作成したためです。ルートパッケージに移動すると、設定画面で起動できました。
このソリューションは、アクティビティを設定ヘッダーにワイヤリングする方法を示します。
まず、ターゲットアクティビティをマニフェストで次のように宣言する必要があります。
<activity Android:name=".ui.activities.MyActivity">
<intent-filter>
<action Android:name=".ui.activities.MyActivity" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
ここで、アクティビティとアクションのAndroid:nameが同じであることに注意してください。
ここで、preferences.xmlファイルで、次のようなヘッダーを宣言するだけで済みます。
<header
Android:title="@string/my_activity_title"
Android:summary="@string/my_activity_summary">
<intent Android:action=".ui.activities.MyActivity"/>
</header>
そして、それがすべてです。
私は同じ問題を抱えていました。これで解決
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>
および設定:
<?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>
targetPackageとtargetClass(prefix)は、パッケージ名をリファクタリングするために異なる場合があります。簡単に確認するには、マニフェストのアクティビティを削除してstartActivity()
を呼び出すと、logCatに次のエラーが表示されます。「明示的なアクティビティクラス{'targetPackage'/'targetClass'}が見つかりません」これらは、Preference> intentに書き込むべき正しい名前です。インテントフィルターは必要ありません。
これを修正するには、インテントフィルターのカテゴリを
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>
アクションをさらに具体的にしたい場合は、カテゴリノード全体を削除するだけです
<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>
マニフェストで<intent-filter>
を次のように宣言することで同じ問題を解決しました。
<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>
<Preference>
<intent
Android:targetPackage="applicationIdFromBuildGradle"
Android:targetClass="targetClassFromJavaFile.YourClassName"/>
</Preference>