私はタブを実装する機能を追加するためにタブを既存のアプリケーションに追加しようとしています。しかし、現時点で設定している方法では、タブごとのスタックは保持されません。だから基本的に私はメインのFrameActivityタブを処理し、各タブにフラグメントを添付します。私の研究の間にタブとフラグメント、別々のバックスタック
私はこのスレッドを見つけた:彼が与えるhttps://stackoverflow.com/a/7480080/792407
の例では、多くの意味になりますが、私はフラグメントが表示するように見えることはできません。だから、私が正しく理解していることを確認するために何をしているのかを説明しましょう:
私はFragmentActivityを拡張してタブを処理するメインタブアクティビティを持っています。私は私のタブを初期化し、この活動の中で
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabHost
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"
>
<TabWidget
android:id="@android:id/tabs"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0"/>
<FrameLayout
android:id="@+android:id/realtabcontent"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
</TabHost>
</LinearLayout>
:レイアウトは次のようになります
mTabHost = getTabHost();
Resources res = getResources();
Intent intent;
TabHost.TabSpec spec;
//search tab
intent = new Intent().setClass(this, searchFragmentStack.class);
spec = mTabHost.newTabSpec("search").setIndicator("Search",res.getDrawable(R.drawable.ic_tab_search)).setContent(intent);
mTabHost.addTab(spec);
//home tab
intent = new Intent().setClass(this, homeFragmentStack.class);
spec = mTabHost.newTabSpec("home").setIndicator("Home",res.getDrawable(R.drawable.ic_tab_home)).setContent(intent);
mTabHost.addTab(spec);
のように私は見て使用していたスタッククラス:ActivityInTab抽象クラスが同じである
public class searchFragmentStack extends ActivityInTab {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
navigateTo(new search());
}
}
彼がスレッドで使用したコード:
abstract class ActivityInTab extends FragmentActivity { // FragmentActivity is just Activity for the support library.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tabs_layout);
}
/**
* Navigates to a new fragment, which is added in the fragment container
* view.
*
* @param newFragment
*/
protected void navigateTo(Fragment newFragment) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.add(R.id.content, newFragment);
ft.addToBackStack(null);
ft.commit();
}
@Override
public void onBackPressed() {
FragmentManager manager = getSupportFragmentManager();
if (manager.getBackStackEntryCount() > 0) {
// If there are back-stack entries, leave the FragmentActivity
// implementation take care of them.
super.onBackPressed();
} else {
// Otherwise, ask user if he wants to leave :)
//showExitDialog();
}
}
}
とスタックのレイアウトは、再び彼の例に基づいています。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:isScrollContainer="true">
</RelativeLayout>
そして、それはかなりそれです。私が得るのは、タブに黒い画面が表示されるだけなので、レイアウトの問題だと思うのですが、間違っているだけです。これは理にかなっていますか?より良い方法がありますか?何か不足していますか?どんな助けでも大歓迎です。
私はダミーのプロジェクトを開始し、最初からすべてをやった後、それを考え出した
あなたがローテーションで何かをやっているの?見ることする価値があるかもしれあなたがタブ1とフラグメントBにいるとき、あなたはフラグメントAに戻ります。 – Streetboy
@ Streetboyアクティブなフラグメント名をonSaveInstanceStateに保存する必要があります。したがって、そのメソッドをオーバーライドし、アクティブなフラグメント名を保存し、次にアプリケーションが起動するときに、savedInstanceStateバンドル内の文字列を探します。見つかったら、そのフラグメント画面に切り替えます。 – Buffalo
リンクからコードをダウンロードしましたが、tabActivityは廃止されました。api> 14!それにはどんな解決策もありますか? –