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 "очищен", никаких ошибок или предупреждений. Я много искал, и я не нашел решения, возможно, я просто что-то пропустил... Пожалуйста, помогите!
Ответы
Ответ 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>