2011-08-01 94 views
8

我正在創建一個包含一個片段的三個選項卡,現在我想用同一個選項卡中的一個新片段替換第一個Tab的片段。我怎樣才能做到這一點與標籤保持不變?如何在單個選項卡中顯示新的片段?

我的代碼 -

Tab_Widget.java

public class Tab_Widget extends TabActivity { 

      TabHost tabHost; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.tab_host); 

      tabHost = getTabHost(); 

      tabHost.addTab(tabHost.newTabSpec("Tab1") 
       .setIndicator("Tab1") 
       .setContent(new Intent().setClass(this, main_activity.class))); 

      tabHost.addTab(tabHost.newTabSpec("Tab2") 
       .setIndicator("Tab2") 
       .setContent(new Intent().setClass(this, second_activity.class))); 

      tabHost.addTab(tabHost.newTabSpec("Tab3") 
        .setIndicator("Tab3") 
        .setContent(new Intent().setClass(this, third_activity.class))); 

      tabHost.setCurrentTab(0); 
     } 
    } 

main_activity.java

public class main_activity extends FragmentActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mainfragment); 
    } 
} 

main_fragment.java

public class main_fragment extends Fragment 
{ 
    LinearLayout mLayout; 
    Button mButton; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     mLayout = (LinearLayout) inflater.inflate(R.layout.main_view, null); 
     mButton = (Button) mLayout.findViewById(R.id.btn); 
     mButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Fragment mFragment = new third_fragment_view(); 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
//    ft.replace(R.id.Maincontainer, mFragment); 
       ft.replace(R.id.main_fragment, mFragment); 
       ft.addToBackStack(null); 
       ft.commit(); 
      } 
     }); 
     return mLayout; 
    } 
} 

我的XML

mainfragment.xml

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/Maincontainer" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<fragment 
    android:name="com.fragment.main_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/main_fragment"> 
</fragment> 
</LinearLayout> 

通過,該片段是獲取調用毫無疑問的,但一世與前面的片段重疊。

回答

7

你有像這樣的結構:

TabActivity 
-> Tab1 = FragmentActivity = MainFragment 
-> Tab2   
-> Tab3   

從內MainFragment您試圖替換其容器(本身)的內容。

這將是最好的,如果在MainFragment稱爲定製TabActivity這又稱爲替代它的容器,或者像這樣(可能會落入相同問題的犯規,因爲它基本上是從同一個地方運行相同的代碼,但它應該給你什麼,我建議的基本思路):

Fragment newFragment = new FragmentToChangeTo(); 
    CustomTabActivity tabActivity = (CustomTabActivity) getActivity(); 
    tabActivity.changeFragment(newFragment); 

如果這不起作用嘗試做類似的事情,但不是調用活動直接通過意圖&操作命令傳遞給它(或Bundles),其中包含關於更改哪個容器的信息。

我寧願說/爲什麼片段不能很好地處理片段碎片​​和相關的複雜問題:檢查here以瞭解爲什麼我建議將片段從片段控制中剪切掉。

+0

@Greame我只是想更換一個片段,片段內不片段。 –

+0

你的錯誤理解。你正在使用一個片段來取代它自己。在最好的情況下,這是令人困惑和糟糕的做法,最糟糕的是它永遠不會工作(不幸的是,片段不是最透明的過程)。創建一個系統,其中一個片段與它的容器進行通信,讓它用其他東西替換它的孩子。 – Graeme

+0

是的,現在我明白了Fragments無法取代它自己,謝謝。 :) –

5

OK,幾件事情:

  1. 你不需要更換都和刪除。有效替換隻是刪除第一個片段,並在其位置添加第二個片段。

  2. 我懷疑你的參數對於替換命令是不正確的。這是正確的形式:

    replace (int containerViewId, Fragment fragment) 
    

    您似乎傳遞片段本身的id,而不是容器的id。 replace命令採用容器視圖的id,並在添加新容器之前刪除該容器中的所有片段。因此,如果這是你的佈局:

    <LinearLayout 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    
        <fragment class="com.example.stackoverflow.YourFragmentName" 
        android:id="@+id/main_fragment" 
        android:layout_weight="1" 
        android:layout_width="0px" 
        android:layout_height="match_parent" /> 
    
    </LinearLayout> 
    

    你可以使用:

    replace(R.id.container, mFragment); 
    

    ,而不是

    replace(R.id.main_fragment, mFragment); 
    
  3. 既然你想findFragmentById(R.id.main_fragment),我懷疑你已經加入此片段到您的XML佈局文件。如果直接在XML中添加片段,則無法在運行時以編程方式將其刪除。爲了刪除或替換碎片,您必須在運行時爲它們添加FragmentTransaction。

編輯:

號2和3,從我原來的答覆仍然適用。您需要使用包含ViewGroup的ID來添加和替換。在這種情況下,這是您的LinearLayout,R.id.Maincontainer,而不是R.id.main_fragment。

另外,正如我之前所說的,您無法刪除直接添加到XML中的片段。您的main_fragment已添加到XML中,因此在運行時無法刪除。

試試這個你mainfragment.xml:

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

    <Button 
    android:id="@+id/btn" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Switch Fragments"> 

</LinearLayout> 

這爲您的main_fragment類:

public class main_activity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mainfragment); 

     //Notice that I am adding this 1st fragment in the Activity and not the XML 
     main_fragment mainFragment = new main_fragment(); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.add(R.id.Maincontainer, mainFragment); 
     ft.commit(); 

     mButton = (Button) findViewById(R.id.btn); 
     mButton.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View v) 
      { 

       Fragment mFragment = new third_fragment_view(); 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
       //Replacing using the id of the container and not the fragment itself 
       ft.replace(R.id.Maincontainer, mFragment); 
       ft.addToBackStack(null); 
       ft.commit(); 
      } 
     }); 
    } 
} 
0

@theisenp我正在創建一個標籤視圖,當點擊一個按鈕時,它必須移動到另一個屏幕,當我嘗試使用上面的代碼實現它時,它正在改變到另一個屏幕,但按鈕仍然可見,下一個屏幕我想下一個屏幕應該覆蓋整個屏幕

public class Tab1Fragment extends Fragment { 
LinearLayout mLayout; 
/** (non-Javadoc) 
* @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) 
*/ 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    if (container == null) { 


     return null; 
    } 

    LinearLayout theLayout = (LinearLayout)inflater.inflate(R.layout.tab_frag1_layout, container, false); 

      // Register for the Button.OnClick event 

      Button b = (Button)theLayout.findViewById(R.id.button1); 

      b.setOnClickListener(new View.OnClickListener() { 



       @Override 

       public void onClick(View v) { 

        Fragment mFragment = new third_fragment_view(); 
        android.support.v4.app.FragmentTransaction ft = getFragmentManager().beginTransaction(); 

        ft.replace(R.id.container, mFragment); 
        ft.addToBackStack(null); 
        ft.commit(); 


       } 

      }); 

    return theLayout; 

} 
} 

activity is displaying partially

相關問題