Подтвердить что ты не робот

Android: Запустите Activity from preferences.xml

Я хотел бы запустить Activity из default preferences.xml, с < тэг. Действия хорошо протестированы, проблема не в этом. (Я расширяю PreferenceActivity в своем приложении, поэтому preferences.xml "приходит" с этим) Посмотрите на код, что не так?

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

Активность не вызывает, когда я нажимаю кнопку "Переименовать элемент", ничего не происходит. LogCat "очищен", никаких ошибок или предупреждений. Я много искал, и я не нашел решения, возможно, я просто что-то пропустил... Пожалуйста, помогите!

4b9b3361

Ответ 1

У меня была такая же проблема. Я получил эту работу, только объявив действие в моем 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>

Затем в моем файле настроек 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>

Ответ 2

Я считаю, что тег <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>

Ответ 3

Внимание! Значение targetPackage должно быть идентификатором пакета приложения, как указано в корневом элементе вашего файла AndroidManifest.xml (который вы определяете в файле сборки Gradle). Это не обязательно так же, как пакет Java вашего класса Activity (люди обычно помещают их в подпакету "ui").

Итак, в вашем конкретном случае, держу пари, что targetPackage должен быть "my.notifier", а не "my.notifier.ui" (я должен был убедиться, что манифест обязательно).

Ответ 4

Не нужно добавлять IntentFilter. Вы можете ссылаться на активность по полному имени:

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

Ответ 5

Когда у меня была эта проблема, это было потому, что я сделал подпакет для своих действий. Когда я переместил его в корневой пакет, экран Preference мог запустить его.

Ответ 6

Это решение покажет вам, как подключиться к активности в заголовках настроек.

Во-первых, ваша целевая активность должна быть объявлена ​​в манифесте следующим образом:

<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: имя для действия и действия одинаковы.

Теперь в вашем файле preferences.xml вам нужно только объявить заголовок следующим образом:

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

И все, что там есть.

Ответ 7

У меня была такая же проблема. и решить этим

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>

Ответ 8

Я смог исправить это, изменив категорию в фильтре намерения с

android.intent.category.DEFAULT

до

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>

Думаю, если вы хотите, чтобы ваше действие было еще более конкретным, просто удалите всю категорию 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>

Ответ 9

targetPackage и targetClass (префикс) могут отличаться в зависимости от имени пакета рефакторинга. Простой способ проверить его можно удалить активность в манифесте и вызвать startActivity(), тогда вы увидите эту ошибку в logCat: "Невозможно найти явный класс активности {" targetPackage "/" targetClass "}". Это правильные имена, которые вы должны записать в Предпочтение > намерение. Intent-filter не нужен.

Ответ 10

Я решил ту же проблему, объявив <intent-filter> в манифесте следующим образом:

<activity
    android:name="PeriodosActivity"
    android:label="Periodos"
    android:screenOrientation="portrait">

    <intent-filter>
        <action android:name="Periodos" /> /*Same as in the preference <intent> element action attribute*/
        <category android:name="android.intent.category.DEFAULT"/>

</intent-filter>

Ответ 11

<Preference>
    <intent
        android:targetPackage="applicationIdFromBuildGradle"
        android:targetClass="targetClassFromJavaFile.YourClassName"/>
</Preference>