Проведите пальцем между действиями Android, как с ViewPager

В моем приложении для Android у меня есть два отдельных, но связанных экрана/действия верхнего уровня. Я хочу иметь для них два отдельных значка запуска, но разрешить пользователю «пролистывать» их, как в ViewPager.

Я вижу следующие варианты:

  1. Реализуйте два отдельных действия и каким-то образом разрешите перелистывание между ними. Проблема в том, что ViewPager нельзя использовать с двумя отдельными действиями.

  2. Реализуйте одно действие с двумя фрагментами и используйте ViewPager для переключения между ними. Свайп простой, но можно ли иметь два лаунчера, которые автоматически переключаются на нужный фрагмент?

Возможен ли какой-либо из двух вышеперечисленных вариантов или есть что-то еще, что я могу попробовать?


person Ralf    schedule 29.10.2011    source источник


Ответы (4)


Я попробовал решение два, но проблема в том, что одно действие не может определить, какой значок запуска использовался (пожалуйста, скажите мне, если я ошибаюсь).

Мое решение состояло в том, чтобы добавить два «фиктивных» действия, которые затем запускают основное действие с правильным номером «страницы». Сложность этого подхода заключается в правильной обработке стека задач. Когда средство запуска выбрано, фиктивное действие должно быть запущено, и оно должно отправить намерение основному действию. Android очень старается помешать вам сделать это и просто снова выводит последнее действие на передний план.

Это лучшее, что я мог придумать:

Фиктивные действия (аналогично LaunchActivity2):

public class LaunchActivity1 extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent newIntent = new Intent(this, MainActivity.class);
        newIntent.putExtra(MainActivity.EXTRA_PAGE, 1);
        newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(newIntent);
        finish();
    }
}

В основной деятельности:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    ViewPager viewPager = (ViewPager)findViewById(R.id.MainViewPager);
    viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));

    int page = getIntent().getIntExtra(EXTRA_PAGE, -1);
    if(page >= 0 && page <= NUM_ITEMS)
        viewPager.setCurrentItem(page);
}

public void onNewIntent(Intent intent) {
    if(intent.hasExtra(EXTRA_PAGE)) {
        int page = intent.getIntExtra(EXTRA_PAGE, -1);
        ViewPager viewPager = (ViewPager)findViewById(R.id.MainViewPager);
        if(page >= 0 && page <= NUM_ITEMS)
            viewPager.setCurrentItem(page);
    }
}

AndroidManifest.xml:

    <!-- LaunchActivity2 is similar -->
    <activity android:name=".LaunchActivity1" android:label="Launch 1"
              android:clearTaskOnLaunch="true"
              android:noHistory="true"
              android:taskAffinity="Launch1"
              android:theme="@android:style/Theme.Translucent.NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <activity android:name=".MainActivity"
              android:label="My App"
              android:clearTaskOnLaunch="true"
              android:finishOnTaskLaunch="true"
              android:launchMode="singleTask"
              android:taskAffinity="MyApp">
    </activity>

Проблема с разным сходством задач заключается в том, что обе программы запуска, а также основная задача отображаются в списке «Недавние приложения».

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

person Ralf    schedule 29.10.2011

Решение 1. Вы можете проводить пальцем по экрану, чтобы каждый раз запускать другое действие. В этом случае вы должны исправить анимацию перехода для двух действий, чтобы иметь эффект «пролистывания», и установить два действия как SingleTask, чтобы не иметь несколько экземпляров в вашей задаче (таким образом, вы должны реализовать метод onNewIntent()) .

Решение 2: Да, это возможно. Основываясь на значке лаунчера, вы должны каждый раз запускать и показывать подходящий фрагмент, а затем использовать свайп для смены вида.

Надеюсь это поможет!

person Dimitris Makris    schedule 29.10.2011
comment
Что касается решения 2, как определить, какой значок запуска использовался? Эта информация присутствует в намерении запуска? - person Ralf; 29.10.2011
comment
Вы можете добавить дополнение к намерению, которое запускает действие, обрабатывающее фрагменты. - person Dimitris Makris; 29.10.2011
comment
Я хочу, чтобы два средства запуска на главном экране запускали действие, поэтому я не могу добавить к этим намерениям какие-либо дополнения. - person Ralf; 29.10.2011

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

Вы можете найти решение там: ViewPager для нескольких действий, используйте фрагменты... (это также в библиотеке поддержки, если вам нужно запустить на более ранних версиях Android)

person Matthieu    schedule 03.10.2012

Я бы выбрал решение 2, нет необходимости в фиктивных действиях, это замедлит запуск вашего приложения, вместо этого вы можете добавить псевдонимы действий в свой манифест, например:

    <activity-alias
        android:name=".MySecondLauncher"
        android:exported="true"
        android:icon="@drawable/my_second_icon"
        android:label="@string/my_second_launcher"
        android:targetActivity=".MainScreen">
        <meta-data
            android:name="secondLauncher"
            android:value="true" />
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity-alias>

Затем в действии MainScreen вы можете проверить, с какой программой запуска вы были вызваны, вы можете сделать это, найдя имя псевдонима активности программы запуска или проверив метаданные, которые я добавил выше:

ComponentName component = intent.getComponent();
String name = component.getShortClassName();
boolean secondLauncher = ".MySecondLauncher".equals(name);

or:

ActivityInfo info = getPackageManager().getActivityInfo(intent.getComponent(),PackageManager.GET_META_DATA);
boolean secondLauncher = info.metaData.getBoolean("secondLauncher", false);
person marmor    schedule 05.08.2015