Открытие фрагмента с помощью быстрого ярлыка приложения

Здравствуйте, я знаю, что это дублирующий вопрос, но я не смог найти решение из других тем.

Вот моя проблема, у меня есть приложение с нижней панелью навигации с пятью фрагментами. Я хочу открыть эти фрагменты через ярлык приложения.

Вот что я создал,

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>
...
Другие вопросы по тегам