Определение того, может ли предыдущая активность обрабатывать несколько фрагментов в текущей ориентации - PullRequest
2 голосов
/ 27 февраля 2012

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

Однако есть одно предостережение: я хочу, чтобы он вел себя таким образом только на экранах большего размера (вероятно, только на планшетах, но это может измениться).На меньших устройствах я хочу видеть только фрагмент Listview и запускать фрагмент деталей в своей собственной деятельности независимо от ориентации.У меня также это работает.

Проблема, с которой я столкнулся в настоящее время, заключается в подробном действии и в том, как определить, когда завершить () и вернуться к предыдущему действию, чтобы показать фрагменты рядом.У меня есть следующий код, который работает для больших устройств, но не позволяет меньшим устройствам просматривать это действие и, таким образом, фрагмент сведений вообще:

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

    if (getResources().getConfiguration().orientation ==
     Configuration.ORIENTATION_LANDSCAPE) {
       finish();
       return;
    }

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

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Эврика! Мое решение состоит в том, чтобы предоставить альтернативный макет для Подробности деятельности, который был пустым. После того, как я надуваю макет, я могу проверить, находится ли ожидаемый фрагмент в макете, а если нет, то я заканчиваю ().

details_view.xml в / res / layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="horizontal">
   <fragment
         android:name="com.website.DetailsFragment"
         android:layout_width="0dp"
         android:layout_height="match_parent"
         android:id="@+id/details_fragment"
         android:layout_weight="75">
   </fragment>
</LinearLayout>

details_view.xml в / res / layout- [размер экрана] Это для экрана любого размера, который вы не хотите отображать фрагмент Details в своем собственном действии в альбомном режиме (более или менее планшетов в моем случае).

<?xml version="1.0" encoding="utf-8"?>
<!-- Note: This file has an empty layout to notify
     DetailsViewActivity that we should go back to landscape
     and view the fragments side by side -->
<LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="horizontal">
</LinearLayout>

Просто поместите пустой файл details_view.xml в любой каталог макета, в котором есть файл макета, позволяющий отображать фрагменты рядом.

Наконец, код для DetailsViewActivity для выхода, если мы хотим вернуться бок о бок:

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

  setContentView(R.layout.details_view);

  mDetailsView = (TopicViewFragment)getSupportFragmentManager()
   .findFragmentById(R.id.details_fragment);

  // We can handle the fragments side by side in the previous activity
  // so lets go back there
  if ((mDetailsView == null || !mDetailsView.isInLayout()) &&
   getResources().getConfiguration().orientation ==
   Configuration.ORIENTATION_LANDSCAPE) {
     finish();
     return;
  }

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

1 голос
/ 08 марта 2012

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

package de.vogella.android.fragments;

  import android.app.Activity;
  import android.content.res.Configuration;
  import android.os.Bundle;
  import android.widget.TextView;

   public class DetailActivity extends Activity {
   @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Need to check if Activity has been switched to landscape mode
    // If yes, finished and go back to the start Activity
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        finish();
        return;
    }

    setContentView(R.layout.details_activity_layout);
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        String s = extras.getString("value");
        TextView view = (TextView) findViewById(R.id.detailsText);
        view.setText(s);
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...