5

我有一個具有FragmentTabHost的MainActivity(FragmentActivity)。FragmentTabHost&Fragments - 如何在標籤之間傳遞數據?

public class FragmentTabs extends FragmentActivity { 
    private FragmentTabHost mTabHost; 

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

     setContentView(R.layout.fragment_tabs); 
     mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); 
     mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 

     mTabHost.addTab(mTabHost.newTabSpec("classA").setIndicator("Class A"), 
      ClassA.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("classB").setIndicator("Class B"), 
      ClassB.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("classC").setIndicator("Class C"), 
      ClassC.class, null); 
    } 
} 

ClassA的,ClassB的和ClassC都是片段(android.support.v4.app.Fragment)。

我需要傳遞碎片上的數據(和調用方法)。我怎樣才能得到每個片的參考,像這樣:

ClassA mClassAFragment = ???; 

我使用getSupportFragmentManager試過()findFragmentByTag(),我也試着探索mTabHost的能力。沒有東西可以得到它們

你能提出一種方法來做到這一點或建議一種替代方法嗎?

回答

11

OP這裏。爲了解決這個問題,我已經重載onAttachFragment方法在我FragmentActivity:

public class FragmentTabs extends FragmentActivity { 
    private FragmentTabHost mTabHost; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
    } 

    @Override 
    public void onAttachFragment(Fragment fragment) { 
    super.onAttachFragment(fragment); 

    if (fragment.getClass() == ClassA.class) { 
     ClassA mClassAFragment = (ClassA)fragment 
      ... 
     } 
    } 
} 
+0

令人敬畏的建議。我認爲這是一個很好的方法。 – Siggy 2014-02-21 06:58:46

+1

我認爲你應該爲片段類而不是直接的'=='比較器做'.equals()'比較。 – alexgophermix 2014-07-22 20:25:03

+2

或intanceof會更好:'片段instanceof ClassA' – kgautron 2014-08-16 12:18:27

3

你可以得到你的片段是這樣的:

YourFragment frag = (YourFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.fragmentid)); 

要發送的數據,你可以按照這個方法片段,創建一個新的事務,並通過捆綁發送數據。

Bundle arguments = new Bundle(); 
arguments.putString("some id string", "your data"); 
YourFragment fragment = new YourFragment(); 
fragment.setArguments(arguments); 
getSupportFragmentManager().beginTransaction().add(R.id.fragmentid, fragment).commit(); 
+8

不錯。不幸的是,findFragmentById()不能與FragmentTabHost一起使用,因爲只有當它們是當前選擇的選項卡時才創建片段。即ClassB和ClassC在我選擇它們之前不存在。我會將您的回答標記爲答案,因爲我認爲它非常接近並且非常有幫助。我會提供我自己的答案以獲取更多信息。 – 2013-02-11 02:31:31

1

這可以通過android.support.v4.app.FragmentTabHost.addTab(則tabspec,類,包args來第三個參數來實現, 則ARGS可以經由android.support.v4.app.Fragment.getArguments()

public class Tab1Fragment extends BaseFragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // do something with the arguments 
    Log.i("DEBUG", "" + getArguments()); 
    // ... 
} 

}

檢索210
+0

不幸的是,沒有。這顯然是最初的意圖,但getArguments()總是在那裏返回null。真可惜,真的...... – 2014-11-16 22:01:50

相關問題