Открытие фрагмента с помощью быстрого ярлыка приложения
Здравствуйте, я знаю, что это дублирующий вопрос, но я не смог найти решение из других тем.
Вот моя проблема, у меня есть приложение с нижней панелью навигации с пятью фрагментами. Я хочу открыть эти фрагменты через ярлык приложения.
Вот что я создал,
shortcut.xml
<shortcuts xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="first"
android:enabled="true"
android:icon="@drawable/shortcut_1"
android:shortcutShortLabel="@string/shortcut_short_label_one"
android:shortcutLongLabel="@string/shortcut_long_label_one"
tools:targetApi="n_mr1">
<intent
android:action="com.xxxxxxx.xxxx.FIRST"
android:targetPackage="com.xxxxxxx.xxxx.test"
android:targetClass="com.xxxxxxx.xxxx.test.MainActivity" />
</shortcut>
<!-- Specify more shortcuts here. -->
<shortcut
android:shortcutId="second"
android:enabled="true"
android:icon="@drawable/shortcut_2"
android:shortcutShortLabel="@string/shortcut_short_label_two"
android:shortcutLongLabel="@string/shortcut_long_label_two"
tools:targetApi="n_mr1">
<intent
android:action="com.xxxxxxx.SECOND"
android:targetPackage="com.xxxxxxx.xxxx.test"
android:targetClass="com.xxxxxxx.xxxx.test.SecondFragment" />
</shortcut>
</shortcut>
Вот onCreate() из MainActivity
private static final String Second = "com.xxxxxxx.xxxx.SECOND";
//code vomited
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Second.equals(getIntent().getAction())){
SecondFragment secondFragment = new SecondFragment();
android.support.v4.app.FragmentTransaction fragmentTransactionTwo = getSupportFragmentManager().beginTransaction();
fragmentTransactionTwo.replace(R.id.content_main, secondFragment, "Fragment two");
fragmentTransactionTwo.commit();
}
BottomNavigationView navigation = findViewById(R.id.navigation);
BottomNavigationViewHelper.disableShiftMode(navigation); //disabling the shitty shifting mode
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
FirstFragment firstFragment = new FirstFragment();
android.support.v4.app.FragmentTransaction fragmentTransactionOne = getSupportFragmentManager().beginTransaction();
fragmentTransactionOne.replace(R.id.content_main, firstFragment, "Fragment one");
fragmentTransactionOne.commit();
}
Здесь первый актив запускает нормально, т.е. MainActivity()
, Но нажмите на второй ярлык, ничего не происходит.
Кто-нибудь объяснит мне, что я делаю не так?
3 ответа
Я вижу пару вещей, которые выглядят не так:
На shortcut.xml:
Оба сочетания клавиш должны быть нацелены на класс "MainActivity", так как это точка входа и ответственность за добавление фрагментов в пользовательский интерфейс. Итак, вам нужно изменить targetClass на втором ярлыке и вместо этого настроить таргетинг на "MainActivity".
По методу onCreate:
Когда действие соответствует второму ярлыку, оно устанавливает второй фрагмент на экране, но метод продолжается и устанавливает поверх него первый фрагмент.
Я думаю, это должно быть if-else:
if (Second.equals(getIntent().getAction())) {
SecondFragment secondFragment = new SecondFragment();
android.support.v4.app.FragmentTransaction fragmentTransactionTwo = getSupportFragmentManager().beginTransaction();
fragmentTransactionTwo.replace(R.id.content_main, secondFragment, "fragment two");
fragmentTransactionTwo.commit();
} else {
FirstFragment firstFragment = new FirstFragment();
android.support.v4.app.FragmentTransaction fragmentTransactionOne = getSupportFragmentManager().beginTransaction();
fragmentTransactionOne.replace(R.id.content_main, firstFragment, "Fragment one");
fragmentTransactionOne.commit();
}
У меня такая же проблема, как у вас, я нашел, как перейти к фрагменту. вы должны попасть в действие. поместите это в onCreate, может быть, это поможет вам
if ("com.xxxxxxx.YourShortcutAction".equals(getIntent().getAction())) {
val fragment = YourFragment()
addFragment(fragment)
}
Я использую Котлин для Android
Через какое-то время нашел ответ, как открыть фрагмент через ярлык Kotlin:
ярлык.xml
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="mainShortcut"
android:enabled="true"
android:shortcutShortLabel="@string/somestring">
<intent
android:action="xxx.example.workapp.test"
android:targetPackage="xxx.example.workapp"
android:targetClass="xxx.example.workapp.MainActivity">
</intent>
</shortcut>
Основная деятельность
class MainActivity : AppCompatActivity() {
private lateinit var bottomNav : BottomNavigationView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
loadFragment(HomeFragment())
if ("xxx.example.workapp.test" == intent.action) {
loadFragment(YourFragment())
}
bottomNav = findViewById(R.id.bottomNav)
bottomNav.setOnItemSelectedListener {
when (it.itemId) {
R.id.homeFragment -> {
loadFragment(HomeFragment())
true
}
R.id.SettingsFragment -> {
loadFragment(SettingsFragment())
true
}
else -> {
false
}
}
}
}
private fun loadFragment(fragment: Fragment){
val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.container,fragment)
transaction.addToBackStack(null)
transaction.commit()
}}
AndroidManifest.xml
...
<activity
android:name=".MainActivity"
android:configChanges="locale"
android:exported="true"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
...