永远不会调用片段onCreateView

时间:2017-06-16 22:26:44

标签: android android-fragments android-lifecycle

我注意到我的一个片段的onCreateView()从未被调用过,我也不知道为什么。我需要能够在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);
}

Tab1Fragment

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;
}

并且在R.layout.tab1

下传递了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" >

  <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的说法创建的,但是当我更改标签时,内容会被“重置”。我放置在onCreateView()onResume()中的任何更改都不会被调用。

修改

我试图实现第1条评论中描述的方法。实现后,选项卡具有相同的内容。就像所有标签都有相同的内容。这次我发布了所有课程及其相关的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>

我不会发布LiveGameTab2LiveGameTab3的代码,因为它们几乎相同。我还有另一项活动

EDIT2

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

时,似乎已解决了问题

1 个答案:

答案 0 :(得分:2)

问题在于:

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();
    }