web-dev-qa-db-ja.com

Android:preferences.xmlからアクティビティを開始

<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は「クリア」であり、エラーや警告はありません。私はよく検索していましたが、解決策を見つけられませんでした。

64
Lama

私は同じ問題を抱えていました。 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>
63
Shygar

<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>
48
Michael

あぶない! targetPackageの値は、AndroidManifest.xmlファイル(Gradleビルドファイルで定義)のルート要素で宣言されているアプリのパッケージIDである必要があります。 ActivityクラスのJavaパッケージと同じである必要はありません(人々は通常、それらを"ui"のサブパッケージに入れます)。

したがって、特定のケースでは、targetPackage"my.notifier"ではなく"my.notifier.ui"でなければなりません(確かにマニフェストを確認する必要があります)。

32
BoD

IntentFilterを追加する必要はありません。完全修飾名でアクティビティを参照できます。

<intent Android:targetPackage="my.notifier.ui"
    Android:targetClass="my.notifier.ui.EditCoursesNamesActivity"/>
18
dvikv90

この問題が発生したのは、アクティビティのサブパッケージを作成したためです。ルートパッケージに移動すると、設定画面で起動できました。

4
Kieran

このソリューションは、アクティビティを設定ヘッダーにワイヤリングする方法を示します。

まず、ターゲットアクティビティをマニフェストで次のように宣言する必要があります。

<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>

そして、それがすべてです。

3
Phil

私は同じ問題を抱えていました。これで解決

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>
2
Ali Bagheri

targetPackageとtargetClass(prefix)は、パッケージ名をリファクタリングするために異なる場合があります。簡単に確認するには、マニフェストのアクティビティを削除してstartActivity()を呼び出すと、logCatに次のエラーが表示されます。「明示的なアクティビティクラス{'targetPackage'/'targetClass'}が見つかりません」これらは、Preference> intentに書き込むべき正しい名前です。インテントフィルターは必要ありません。

1
yoo

これを修正するには、インテントフィルターのカテゴリを

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>
1
concept

マニフェストで<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>
0
Style-7