从Android 7.1应用程序快捷方式启动Fragment(而不是Activity)

时间:2016-10-26 15:24:06

标签: android android-fragments android-manifest android-7.1-nougat app-shortcut

我决定将静态快捷方式添加到应用程序中,使用此页面作为参考:

https://developer.android.com/preview/shortcuts.html

我的快捷方式的XML目前是这样的:

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:shortcutId="id"
        android:enabled="true"
        android:icon="@drawable/icon"
        android:shortcutShortLabel="@string/short_label"
        android:shortcutLongLabel="@string/long_label"
        android:shortcutDisabledMessage="@string/disabled_message">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.example"
            android:targetClass="com.example.Activity" />
        <categories android:name="android.shortcut.category" />
    </shortcut>
</shortcuts>

问题来自targetClass变量,因为我找不到启动Fragment而不是Activity的方法。我希望从快捷方式启动的大多数主要页面都在Fragments内显示Activity。如何让intent直接发送到Fragment

2 个答案:

答案 0 :(得分:22)

您可以执行以下操作:

1)在shortcuts.xml中指定的意图中,设置自定义意图操作字符串:

 <intent
        android:action="com.your.packagename.custom.name"
        android:targetPackage="com.example"
        android:targetClass="com.example.Activity" />

2)检查getIntent().getAction()中指定的活动中的android:targetClass意图操作:

public void onCreate(Bundle savedInstanceState){
    if (CUSTOM_NAME.equals(getIntent().getAction()){
        // do Fragment transactions here 
    }
}

答案 1 :(得分:3)

您可以使用Shortbread库轻松实现此目的。

public class MainActivity extends Activity {

    @Shortcut(id = "movies", shortLabel = "Movies", icon = R.drawable.ic_shortcut_movies)
    public void showMovies() {
        getFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, new MoviesFragment())
                .commit();
    }
}

Shortbread.create(this)onCreate()的{​​{1}}方法中添加Application即可。