永远不会调用片段 onCreateView

Fragment onCreateView is never called

我注意到我的一个片段中的 onCreateView() 从未被调用,我不知道 why.I 需要能够在 onResume() 中进行更改,但那也从未被调用。

这是我添加片段的方法。

public class LiveGameStats extends FragmentActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_live_game_stats);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().add(R.id.tab1, new Tab1Fragment()).commit();
    }

    FragmentTabHost mTabHost = (FragmentTabHost) findViewById(R.id.liveGameTabhost);
    mTabHost.setup(LiveGameStats.this, getSupportFragmentManager(), R.id.liverealtabcontent);
    mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("You"),
            LiveGameTab1Fragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("Your Team"),
            LiveGameTab2Fragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("tab3").setIndicator("Your Enemies"),
            LiveGameTab3Fragment.class, null);
}

Tab1片段

public class Tab1Fragment extends Fragment {

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View V = inflater.inflate(R.layout.tab1, container, false);
    Log.v("FRAGMENT","FragmentActivityCreateView");
    return V;
}

最终 xml 通过 R.layout.tab1

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context=".DeviceFragment" >

  <ImageButton
    android:id="@+id/searchBtn"
    android:src="@drawable/waves"
    android:background="@drawable/search_selector"
    android:padding="40dp"
    android:layout_height="200dp"
    android:layout_width="200dp"
    android:onClick="liveMatch"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />
</RelativeLayout>

我想我可能以错误的方式创建了片段。正如您现在看到的那样,它们是按照 xml 所说创建的,但是当我更改选项卡时,内容是 "reseted"。我在 onCreateView()onResume() 中所做的任何更改都不会被调用.

编辑

我已经尝试实现第一个评论中描述的方法。实施后,选项卡具有相同的内容。就像所有选项卡都具有相同的内容一样。这次我 post 编辑了我所有的 类 及其关联的 XML。

public class LiveGameStats extends FragmentActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_live_game_stats);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().add(R.id.liverealtabcontent, new LiveGameTab1Fragment()).commit();
        getSupportFragmentManager().beginTransaction().add(R.id.liverealtabcontent, new LiveGameTab2Fragment()).commit();
        getSupportFragmentManager().beginTransaction().add(R.id.liverealtabcontent, new LiveGameTab3Fragment()).commit();

    }

    FragmentTabHost mTabHost = (FragmentTabHost) findViewById(R.id.liveGameTabhost);
    mTabHost.setup(LiveGameStats.this, getSupportFragmentManager(), R.id.liverealtabcontent);
    mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("You"),
            LiveGameTab1Fragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("Your Team"),
            LiveGameTab2Fragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("tab3").setIndicator("Your Enemies"),
            LiveGameTab3Fragment.class, null);
}

activity_live_game_stats.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_live_game_stats"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@android:color/holo_blue_light"
  tools:context="lucian.leagueassistant.activity.LiveGameStats">


  <android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/liveGameTabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TabWidget
            android:id="@android:id/tabs"

            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:orientation="horizontal" />

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />

        <FrameLayout
            android:id="@+id/liverealtabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

    </LinearLayout>
  </android.support.v4.app.FragmentTabHost>
</LinearLayout>

我不会 post 来自 LiveGameTab2LiveGameTab3 的代码,因为它们几乎相同。我还有另一个 activity

编辑2

当我从 getSupportFragmentManager().beginTransaction().add(R.id.liverealtabcontent, new LiveGameTab1Fragment()).commit(); 更改为 getSupportFragmentManager().beginTransaction().add(android.R.id.tabcontent, new LiveGameTab1Fragment()).commit();

时似乎已解决

问题是这样的:

getSupportFragmentManager().beginTransaction().add(R.id.tab1, new Tab1Fragment()).commit();

在第一个参数中,您必须将 id 传递给 Activity 布局中的容器,您的片段将被附加到该容器。

您正在传递整个布局 R.id.tab1

activity_live_game_stats xml 文件中添加容器视图,

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context=".DeviceFragment" >

   <FrameLayout
    android:id="@+id/myContainer"
    ...(Other attrs)>
    </FrameLayout>

</RelativeLayout>

然后

  if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().add(R.id.myContainer, new Tab1Fragment()).commit();
    }