各タブまたは複数のバックスタックの履歴





問題



android 3.0(Api Level 11)のリリースで、androidにフラグメントが出現したため、Google開発者にとっては、1つのバックスタックのみがサポートされていることが判明しました。 設計者と顧客は、この機能を常に考慮したいとは限りません。 また、既存のiosアプリケーションの完全なコピーが必要な場合もあります。



各タブの履歴を保存するなど、Androidのタブバーに類似する必要があるとします。 しかし、1つのバックスタックがあり、何をしますか? タスクは不可能のようです。



リサーチ



「聞かないとわからない。 知っているなら、尋ねるだけです。」


一方で、これは公式ガイド (「動作」を参照)と矛盾しています。これは、下からのナビゲーションで状態をリセットする必要があることを明確に示しています。

しかし、ユーザーの利便性に関して誰が気にしますか? 心から、あなたはそれが推奨される方法がより便利であることを認めますか?



そして、プラットフォームの制限のために不可能と思われるすべてを同じように行うことはどのように可能ですか? いくつかのオプションは、他のオプションよりも複雑になりますが、グーグル検索はさらにひどい松葉杖を与えます。



しかし、Instagramがどのようにそれをしたかを覗くことができるのなら、なぜだと思いますか? ちなみに、Instagramは必ずしもそのように機能するとは限りませんでした。Instagramのデザインがタブ化され、切り替えたときにストーリーがリセットされたことがありました。



Instagram APKをapktoolを使用して逆コンパイルし、そこにあるものを確認します。 アプリケーションのメインアクティビティはcom.instagram.android.activity.MainTabActivityであり、com / instagram / base / activity / tabactivity / aクラスから継承されているものから見ていきます。これは、android / app / ActivityGroupから継承されます。 さらに掘ることはできません。



ActivityGroupTabActivityLocalActivityManagerなどのクラスは、13 Api Levelから、つまりフラグメントが出現するとすぐに廃止されます。 以下は、これらのクラスについてdeveloper.android.comで書かれています。

このクラスは、APIレベル13で廃止されました。

代わりに、新しいFragmentおよびFragmentManager APIを使用してください。 これらは、Android互換パッケージを介して古いプラットフォームでも利用できます。


誰もが、新しい開発で非推奨を使用するのは良くないことを知っています。 誰もが断片について書くことを急ぎ、クラスは忘れられました。



解決策?



おそらくこれが唯一の有効なソリューションです。 松葉杖なしですぐに動作します(非推奨は考慮されていません)。 個人的には、LocalActivityManagerを忘れてしまいましたが、8 Apiレベルの携帯電話が他の携帯電話よりも多かった頃にAndroid向けの開発を始めましたが、活発に混み合っていました。



どこでも頑固にすべてが私たちの断片であると主張し、単一のアクティビティアプリケーションを開発する傾向は非常に不変であるため、2011年以降にAndroidで開発に参加した人は、おそらくLocalActivityManagerについて何も聞いていません。



これは簡単な解決策であり、使用しないのは愚かなことです。 各タブには、独自のライフサイクルを持つアクティビティがあり、最も重要なのはバックスタックです!



いくつかのコード



TabHostの使用は簡単です。 何を探すべきかを知っていれば、その使い方に関する多くの古代のチュートリアルを見つけることができます。 インターネットは記憶しています。



主なアクティビティのレイアウト:



<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TabHost android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/bottom_bar" android:layout_below="@+id/top"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content"></TabWidget> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent"></FrameLayout> </LinearLayout> </TabHost> </FrameLayout>
      
      





実際のコード:



 //     TabActivity (  deprecated), //    deprecated ,    ? public class MainActivity extends android.app.ActivityGroup { TabHost mTabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTabHost = (TabHost)findViewById(android.R.id.tabhost); mTabHost.setup(getLocalActivityManager()); TabHost.TabSpec tabSpec; tabSpec = mTabHost.newTabSpec("tag1"); tabSpec.setIndicator(" 1");//use getString //TabActivity    AndroidManifest tabSpec.setContent(new Intent(this, TabActivity.class)); mTabHost.addTab(tabSpec); tabSpec = mTabHost.newTabSpec("tag2"); tabSpec.setIndicator(" 2");//use getString //TabActivity    AndroidManifest tabSpec.setContent(new Intent(this, TabActivity.class)); mTabHost.addTab(tabSpec); } }
      
      





PS



非推奨のクラスを使用する必要があるのは残念ですが、Googleが別の決定を下すまで、これが唯一の適切なオプションです。 バックスタックを1つ使用するだけで便利なナビゲーションを構築できます。考慮に入れる必要がある他の妥当なプラットフォーム制限があり、正当化されますが、この場合、GoogleはFragment APIの設計時にこの機会を逃したようです。



この瞬間、アンドロイドは間違いなくiPhoneよりもクールではなかったことが判明しました...



All Articles