轮换上的Android片段(奇怪)行为改变

时间:2015-06-03 19:10:22

标签: android android-fragments

背景故事:我正在构建一个应用程序作为学校项目。它与API一起使用以获取一些JSON并将其转换并显示给用户。

注意:(玩家是坦克世界的人,我正在使用他们的api)

我目前的结构: 首页 - >导航抽屉 - >玩家 - >选择播放器 - >播放器的详细信息

Start Searching player Player detail This happens after turning the screen to horizontal

我的问题: 在播放器的详细视图中,它可以完美打开。当我将方向更改为水平屏幕时,它会“返回”搜索视图。

当我从导航抽屉转到播放器的细节(使用硬编码播放器)并且我将屏幕更改为水平时没有任何反应。

我完全无能为力。

最后一些代码:(请不要这是学校项目,我是android的新手)

我选择只开发api 21+

XML搜索

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:id="@+id/someId">


    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/search_query"
        android:hint="@string/search_hint"
        android:layout_alignBottom="@+id/search_button"
        android:layout_alignParentStart="true"
        android:maxLines="1"
        android:layout_toStartOf="@+id/search_button" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/search_button"
        android:onClick="getPlayers"
        android:id="@+id/search_button"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true" />

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
          android:id="@id/android:list"
        android:layout_below="@+id/search_query"
        android:layout_alignParentStart="true" />



</RelativeLayout>

XML详细信息

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/player_detail_fragment"
    tools:context="com.jdkmedia.vh8.fragment.PlayerDetailFragment">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/playerName"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="24dp"/>


    <android.support.v7.widget.RecyclerView
        android:id="@+id/tank_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        android:layout_below="@+id/playerName"
        android:layout_alignParentStart="true"
        android:layout_marginTop="40dp" />

</RelativeLayout>

MainActivity导航抽屉

 @Override
    public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;

        switch (position) {
            case 0:
                fragment = MainActivityFragment.newInstance(accessToken);
                Log.i(APP + " Class: " + TAG, "Main activity fragment selected");
                break;
            case 1:
                fragment = PlayerSearchMainFragment.newInstance();
                Log.i(APP + " Class: " + TAG, "Player search activity fragment selected");
                break;
            case 2:
//                fragment = new TankCompareTopFragment();
                Player player = new Player(314134134,"stack overflow");
                onPlayerSelected(player);
                break;
            default:
                fragment = MainActivityFragment.newInstance(accessToken);
                Log.i(APP + " Class: " + TAG, " default fragment selected");
                break;
        }

        if(fragment != null){
            Log.i(APP + " Class: " + TAG, "Fragment is not null - transaction");
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction(   )
                    .replace(R.id.container, fragment, fragment.getClass().getName()).addToBackStack(fragment.getClass().getName()).commit();
        }
    }

可以在需要时发布任何其他代码文件。

3 个答案:

答案 0 :(得分:2)

  1. 设备已旋转。 FragmentManager保存所有片段的状态, 然后释放他们。
  2. 新活动。实例化新片段,恢复状态。
  3. 片段被移入onCreate。
  4. onCreate of NavigationDrawerFragment会触发替换事务。
  5. 替换事务会删除已恢复的PlaceholderFragment 一个新的,没有保存状态。 感谢Chiu-Ki Chan取自here

答案 1 :(得分:1)

您需要保存片段状态。修改你的onCreate以使其类似于此。

onCreate(Bundle save){
   super.onCreate(save);
   setRetainInstance(true);
}

答案 2 :(得分:0)

来自Android文档 - http://developer.android.com/guide/topics/resources/runtime-changes.html

如果调用OnDestroy(因为它在运行时更改),您的活动将使用onCreate重新启动。

您可以使用onSaveInstanceState()捕获onPause()中的状态,并使用onRestoreInstanceState()在onCreate()期间恢复它。

对于片段,您应该在片段的onCreate()中使用setRetainInstance(boolean)。

之前已经提出了类似的问题。您可以通过stackoverflow搜索找到更多详细信息。