2011-08-01 20 views
8

1つのフラグメントを含む3つのタブを作成していますが、最初は同じタブ内の最初のタブのフラグメントを新しいフラグメントに置き換えます。タブを同じままにして、どうすればいいですか?1つのタブに新しいフラグメントを表示するにはどうすればよいですか?

マイコード -

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

あなたがそうのような構造を持っていますMainFragmentあなたはそのコンテナ(自身)の内容を置き換えようとしています。

MainFragmentがカスタマイズされたTabActivityと呼ばれ、そのコンテナの代わりにコンテナの代わりに呼ばれているのがベストでしょう(同じ場所から同じコードを基本的に実行しているので、これは、同じようなことをやってみてください動作しますが、代わりに活動を呼び出す直接テント&アクションを通じて、それにコマンドを渡していない場合(

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

:それはあなたに私が示唆されてるかの基本的な考え方)を与える必要がありますまたはBundles)にどのコンテナを変更するかに関する情報が含まれています。私は断片のコントロールの外断片を切断することをお勧め理由はhereをチェック:

私は/フラグメントは、フラグメント・イン・フラグメントおよび関連複雑でうまく動作しない理由/回答することが好ましいだろう。

+0

@Greame画面全体をカバーする必要がありますしたい私は、断片内フラグメント不可、フラグメントを交換したいです。 –

+0

あなたの誤解。あなたは自分自身を置き換えるために断片を使用しています。非常に最善の状態では、これは決してうまくいかないことがあります(残念ながら、断片は最も半透明なプロセスではありません)。断片をコンテナと通信するシステムを作成して、子要素を別のものに置き換えるようにします。 – Graeme

+0

はい、今、私はフラグメントがそれ自身を置き換えることはできません、ありがとう。 :) –

5

OK、いくつかのこと:

  1. あなたが必要との両方交換し、削除しないでください。効果的に置換すると、最初のフラグメントを削除し、その代わりに2番目のフラグメントを追加します。

  2. あなたの引数がreplaceコマンドで間違っていると思われます。これは適切な形式です:

    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> 
    

    :あなたはfindFragmentById(R.id.main_fragment)しようとしているので

    replace(R.id.container, mFragment); 
    

    なく

    replace(R.id.main_fragment, mFragment); 
    
  3. 、私はあなたがこのフラグメントを追加したと思われますXMLレイアウトファイルに追加します。フラグメントをXMLに直接追加した場合は、実行時にプログラムで削除することはできません。フラグメントを削除または置換するには、実行時にFragmentTransactionを追加する必要があります。

EDIT:私のオリジナルの答えから

番号2と3が適用されます。追加および置換するには、含まれているViewGroupのIDを使用する必要があります。この場合、それはR.id.main_fragmentではなく、LinearLayout、R.id.Maincontainerです。

また、前述したように、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クラスのために:の内側から

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

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

関連する問題