タブ間の意図を処理する方法を知る必要があります。たとえば、2 つのタブを持つタブ アクティビティがあります。最初のコンテンツはテキスト ビューです。もう 1 つはマップ ビューです。そのテキスト ビューをクリックすると、tab2 にリダイレクトされます。setCurrentTab(1) または setCurrentTabByTag("tab2") メソッドで簡単に実現できます。しかし、そのマップ アクティビティに緯度と経度の値を渡してピンをドロップしたいと考えています。javaでインテントまたはゲッター/セッターを使用するより良い方法は何ですか? あなたは何を好むか?あなたの答えが「意図」の場合。どのように?
4 に答える
興味深い問題です。最初のタブビューでのクリックで 2 番目のタブに変更するだけでなく、最初のタブのアクションに依存する特別なデータを 2 番目のタブに渡したいということを理解しています。
通常、アクティビティを使用してタブ内のビューを開始します。ただし、これはタブ ホストが構成された時点で行われます。つまり、ユーザーが緯度経度を選択できるアクティビティのインテントと緯度経度を表示するインテントの両方が同時にオープンエンドになります。
したがって、タブ ホストの初期化に使用されるインテントに情報を追加することはできません。解決策は好きではありませんが、(タブにさまざまなアクティビティを使用して)頭に浮かぶ唯一のことは、2番目のタブでビューを更新するために必要なデータを含むオブジェクトへの参照を保存するカスタムアプリケーションを使用することです. 独自のクラスでアプリケーションを拡張し、このクラスをマニフェストに追加する必要があります。これで、最初のタブで getApplication を呼び出して、setCurrentTab を呼び出す直前に緯度と経度を設定したアプリケーション クラスにキャストできます。2 番目のタブでは、 getApplication()を呼び出すことができますもう一度実行すると、アプリが実行されているすべての瞬間に、すべてのアクティビティで同じアプリケーション オブジェクトが取得されます。次に、アプリケーション オブジェクトに再度キャストし、緯度と経度の値を取得します。カスタム アプリケーション クラスの使用方法については、Google リファレンスのこのページを参照してください。
カスタム アプリケーション クラスを使用するには、マニフェストのアプリケーション タグに次を追加します。
<application
...
android:name=".somepackage.CustomAppClass"
これにより、アプリの起動時に Application クラスとして CustomAppClass をインスタンス化するように Android に指示します。起動時のエラーを回避するには、アプリケーションを拡張する必要があります。
別の解決策ですが、私が好むものではなく、自分でビューを初期化し、アクティビティではなくビューでタブホストを初期化することです。タブの 1 つでマップ ビューを使用すると、メモリを大量に消費する可能性があります。
私はここで問題を見ていません:多分それは少しハックですが、次のコードは私のために働きます:
public boolean onClick(View v) {
//get your data you wanna send.
//If it is an Object it would be good if it is Parcelable
Object o = getYourData();
// or Parcelable p = getYourData
Activity activity = getParent();
//I'm assuming were inside an Activity which is started by TabActivity
if (activity instanceof TabActivity){
TabActivity ta = (TabActivity)activity;
//now determine the Tab you wanna start
ta.getTabHost().setCurrentTabByTag("yourTag");
//or ta.getTabHost().setCurrentTab(yourID);
Activity current = ta.getCurrentActivity();
//check if the Activity is the one you wanna start
if (current instanceof YOUR_ACTIVITY_YOU_WANNA_START){
//Cast to your Activity
YOUR_ACTIVITY_YOU_WANNA_START yourActivity =
(YOUR_ACTIVITY_YOU_WANNA_START)current;
// you only need to put Data inside your Intent
Intent intent = new Intent();
intent.putExtra("EXTRA_DATA_TAG", o);
//your Activity must Override onNewIntent and make it public,
//or simply add another method
//with whatever You like as parameter
yourActivity.onNewIntent(intent);
return true;
}
}
return false;
}
このようにして、Application、SharedPrefs、またはここで説明されているその他の不要なものをいじる必要はありません。
アクティビティ間で値を渡したい場合は、以下を参照することをお勧めします
http://developer.android.com/reference/android/content/SharedPreferences.html
あるアイテムから別のアイテムに値を取得する最良の方法。
sharedPrefrences を使用すると、アプリケーション全体でクラスのインスタンスが 1 つだけになります。つまり、ファイルに値を保存し、インテントまたはアクティビティを切り替えてから、データを含む sharedPrefrence ファイルを呼び出すことができます。
唯一の欠点は、プリミティブ型 (int、string、boolean) を渡す必要があることですが、これを回避する方法を理解できると確信しています :)。
2番目のタブアクティビティを開始するために使用しているインテントをグローバルインテントにすると、
onPause()
次に、最初のタブのこのインテントにエクストラを追加できます。TabActivity
注:このアクティビティは呼び出されないため、タブホストとは別のアクティビティですべてのタブを定義する必要がありますonPause()
。
これは上記の答えにも役立ちます。アプリケーションを拡張するアクティビティに保存されたグローバル変数を使用している場合は、アクティビティが切り替わる前onPause()
に起動されるときにこれを設定できます。これを他の場所に設定すると問題が発生する可能性があります。