Обработка setDisplayHomeAsUpEnabled с фрагментами

У меня есть макет на основе фрагментов с двумя ListFragments (A и B), оба из которых содержатся в действии (называемом ListingActivity 1). Когда приложение запускается, вызывается ListingActivity 1, и в зависимости от того, находится ли устройство в книжной или альбомной ориентации, отображается либо только ListFragment A, либо оба ListFragment.

Когда вы щелкаете элемент в ListView фрагмента A, затем отображается ListView фрагмента B. Когда вы щелкаете элемент в ListView фрагмента B, он переходит к новому действию (действие 1).

Я использую этот код (называемый ListingActivity 2), чтобы определить, показывать ли ListFragment B отдельно или вместе с ListFragment A:

public class ListingActivity extends SherlockFragmentActivity  
{
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            // If the screen is now in landscape mode, we can show the
            // dialog in-line so we don't need this activity.
            finish();
            return;
        }

        if (savedInstanceState == null) {
            // During initial setup, plug in the details fragment.
            final ListingFragment details = new ListingFragment();
            details.setArguments(getIntent().getExtras());

            getSupportFragmentManager().beginTransaction().add(android.R.id.content, details).commit();
        }
    }
}

В Упражнении 1 я использую setDisplayHomeAsUpEnabled, чтобы включить логотип панели действий в качестве кнопки «Назад», но я не уверен, как справиться с намерением «домой». Когда устройство находится в портретном режиме, пользователь должен вернуться к ListingActivity 2, но если он находится в ландшафтном режиме, он должен вернуться к ListingActivity 1.

Я собирался сделать что-то вроде этого, но это кажется очень хакерским:

@Override
public boolean onOptionsItemSelected(final MenuItem item) 
{
    if (item.getItemId() == android.R.id.home) 
    {
        final Intent intent;

        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
            intent = new Intent(this, ListingActivity1.class);
        else
            intent = new Intent(this, ListingActivity2.class);

        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}

person Kris B    schedule 22.04.2012    source источник


Ответы (1)


Честно говоря, я думаю, что ваше решение является правильным способом реализации описанного поведения. Он соответствует всем стандартам Android в отношении навигации вверх (в этом случае он должен действовать как кнопка «назад», я полагаю). Единственное, что я бы пересмотрел, это использование вами флага Intent.FLAG_ACTIVITY_NEW_TASK. Из документации Android:

Задача — это последовательность действий, которым пользователь следует для достижения цели.

и в этом случае не похоже, что вы начинаете новую задачу.

person Alex Lockwood    schedule 22.04.2012
comment
Звучит отлично. Я думаю, если я проверяю, находится ли ориентация в альбомной ориентации в ListActivity, я должен иметь возможность нажать кнопку «вверх». В идеале я хотел бы проверить smallestScreenWidthDp, но это не было введено в Android 3.2. Что касается использования Intent.FLAG_ACTIVITY_NEW_TASK, я использую его в своем коде выше с методом addFlags, не уверен, что должен использовать его где-то еще. - person Kris B; 22.04.2012
comment
@Alex использует навигацию вверх. Он переходит к нужному фрагменту, но снова перезагружается, чтобы показать. Как этого избежать? Я реализую это решение предыдущее действие с предыдущим фрагментом"> stackoverflow.com/questions/24596036/, но он перезагружает этот фрагмент. Причина очевидна: это загрузка активности. Но как этого избежать? - person Roon13; 19.06.2015