16

TabHostを使って入れ子になった3つのタブを表示するAndroidアプリケーション(1.6互換)をアップグレードしようとしています。Android 1.6&Fragment&Tabhost

私はActivityGroupトリックを使用してタブにネストされたアクティビティを表示しましたが、いくつかの機能を処理するのは本当の苦痛なので、このメソッドには非常に不満です。

私はFragments API互換パッケージ1.6について聞いたことがありますが、Fragmentは何をしたいのですか(トランジションエフェクトなどでタブ内にネストされたビュー/機能を表示する)には向いていますが、 TabHost(これはAction Barで動作するようになっていますが、互換性パッケージでは利用できません)。

は君たちのいずれかが、あなたのアプリケーションでは、このような構造を作成する方法を発見しましたか?

私のエラーはここにある:

ERROR/AndroidRuntime(955): Caused by: java.lang.RuntimeException: Unable 

が活動を開始する ComponentInfo {com.XXX} java.lang.IllegalArgumentExceptionが: フラグメントMyFragmentのID 0x1020011が見つかりません

コード

main.xml

<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

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

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:padding="5dp" 
      android:layout_weight="1" /> 

     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0" /> 

    </LinearLayout> 

</TabHost> 

MainActivity.java

public class MainActivity extends TabActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     Resources res = getResources(); 
     final TabHost tabs = getTabHost(); 
     TabHost.TabSpec spec; 
     Intent i; 

     i = new Intent(this, MyActivity.class); 
     spec = tabs.newTabSpec("MyActivity").setIndicator("MyActivity",res.getDrawable(R.drawable.tab)).setContent(i); 
     tabs.addTab(spec); 

    } 

} 

MyActivity.class

public class MyActivity extends FragmentActivity { 

    private static String TAG = "MyActivity"; 
    private static FragmentManager fragmentManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     ListeResultatFragment fragment = MyFragment.newInstance(); 
     fragmentTransaction.add(android.R.id.tabcontent, fragment, "MyFragment"); 
     fragmentTransaction.commit(); 

    } 

} 

MyFragment.java

public class MyFragment extends Fragment { 

    public static MyFragment newInstance() { 
     MyFragment instance = new MyFragment(); 
     return instance; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment, container, false); 
    } 

} 
+0

あなたは 'TabHost'に' FrameLayout'の子として ''要素を置くことができないと言っていますか?私はこれがうまくいくと思っていただろうが、私はまだそれを個人的に試していない。 – CommonsWare

+0

私が働いていないものを正確に説明してください。常にフラグメントをプログラムで追加できることを忘れないでください。 – oriharel

+0

コードが追加されました:) – Vivi

答えて

10

MyActivityは、android.R.id.tabcontentをコンテナIDとして使用して、同封のMainActivityに連絡しようとしています。これは不可能です。代わりに、MyActivityは、Fragmentの親として使用できる独自のレイアウト(FrameLayoutなど)を持つ必要があります。このレイアウトでは、idで参照できるビューが存在する必要があります。

activity_layout.xmlという名前のレイアウトに、 'framelayout'というIDのFrameLayoutが含まれているとします。自分自身で作業できるようにする必要がありMyActivity、言い換えれば

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    View parent = getLayoutInflater().inflate(R.layout.activity_layout, null); 
    setContentView(parent); 

    fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment fragment = MyFragment.newInstance(); 
    fragmentTransaction.add(R.id.framelayout, fragment, "MyFragment"); 
    fragmentTransaction.commit(); 
} 

:あなたは、このような何かにMyActivityonCreate方法を変更することができます。最初に動作させてから、MyActivityをTabHostを含むMainActivityに埋め込みます。

4

なぜあなたはあなた自身のタブバーを作成しないでください。構築が簡単なverryです。 LinearLayoutにボタンをいくつか追加して、FragmentManagerを使用してフラグメントを切り替えるonClickListenerを設定するだけです。フラグメントマネージャは、FragmentActivityから取得できます。

FragmentManager fragmentManager = getSupportFragmentManager(); 

onClickハンドラでは、スイッチとの間で正しいフラグメントを処理するだけです。