Проведите между действиями Android как с ViewPager - PullRequest
6 голосов
/ 29 октября 2011

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

Доступные варианты:

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

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

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

Ответы [ 4 ]

2 голосов
/ 29 октября 2011

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

Мое решение состояло в том, чтобы добавить два «фиктивных» действия, которые затем запускают основное действие с правильным номером «страницы». Сложность такого подхода заключается в правильной обработке стека задач. Когда выбран модуль запуска, должна быть запущена фиктивная операция, и она должна отправить намерение основной операции. 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>

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

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

1 голос
/ 29 октября 2011

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

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

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

0 голосов
/ 05 августа 2015

Я бы выбрал решение 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);

или:

ActivityInfo info = getPackageManager().getActivityInfo(intent.getComponent(),PackageManager.GET_META_DATA);
boolean secondLauncher = info.metaData.getBoolean("secondLauncher", false);
0 голосов
/ 03 октября 2012

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

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

...