2013-02-09 7 views
5

私は通常、複数のタスクに存在したいアクティビティを持っているので、[戻る]ボタンは以前の状態を復元します。しかし、私はまた、既存のアクティビティに​​を使用し、新しいものをタスクスタックにプッシュしないでください(現在表示されているものを検索したいので)。ここに私の問題だ:私は「singleTop」にアクティビティの起動モードを設定した場合singleTopを使わないでAndroid SearchViewを使用するにはどうすればよいですか?

  • 、SearchViewは、現在のアクティビティで動作しますが、スタックに新たな活動をContext.startActivity追加しません。
  • アクティビティの起動モードを「標準」に設定した場合、startActivityは新しいアクティビティをスタックに追加しますが、既存のアクティビティを検索する代わりに新しい(空の)アクティビティを作成します。

私はどのような方法がSearchViewが意図フラグ(例えばFLAG_ACTIVITY_SINGLE_TOP使うように見つけることができません。私は、「singleTop」は、その後、すべての意図にFLAG_ACTIVITY_NEW_TASKを追加するために起動モードを設定し、周りに他の道を進んでみましたが、それは起動時にのみ働いていました新しいアクティビティクラスからアクティビティの新しいインスタンスを起動しようとすると、AndroidはFLAG_ACTIVITY_NEW_TASKを尊重せず、新しいタスクをスタックにプッシュしませんでした。

多分、私はできることがありますActivity.onNewIntentで、それ自身をクローンするように活動を強制する。

私はgivin検索ビューでgアップするだけで、その事実にもかかわらず「Android 3.0以降、アクションバーの項目としてSearchViewウィジェットを使用することがアプリで検索を提供するための好ましい方法です」Source) - 今のところ、それはあまりにも柔軟性がなく、非自明な場合に有用であるように設定できないように思えます。

誰でもこの問題の解決策を見つけましたか?

+0

レスポンスが不足している(ビュー数が少ない)ので、これは重要な問題ではないと思います。単一のトップアクティビティを設計して、独自のステートスタックを維持し、状態を切り替えることができます。その後、Backボタンをインターセプトして、タスクスタックを移動することをシミュレートします。しかし、唯一の選択肢であれば、Googleが本格的にSearchViewをプロダクション用に推奨し、独自の検索アクションコンポーネントを作成することにします。 – Canuck

答えて

4

多くの反省と誤った開始の後、私はSearchViewがこのタスクの間違ったものであることに気付きました。 Googleは、非常に特定のタイプの検索活動を念頭に置いたSearchViewを設計しました。

  • ユーザーが検索クエリを入力します。
  • アプリは結果のリストを示す新しいアクティビティをプッシュします。

これは私が使用していた検索モデルではありません。その代わりに、クエリを使用して現在画面に表示されているリストを絞り込みたいと思っていました。これは同期クエリと応答モデルよりもフィルタリング検索の方が優れていました。 SearchViewはそのために設計されていないので、私は自分のウィジェットを書いて(そしてそれを検索メニュー項目と検索ボタンに結びつけた)。

私はこの質問に誰もコメントをしていないことに驚いています。通常、Androidの質問は多くの議論を生み出します。私はこれがあまりにも遠すぎると思う。

+1

私は既に閲覧可能な項目をフィルタリングするためにSearchViewを使用できるかどうかについても疑問に思っていました。 SearchViewは別のアクションを開始することを意図していることを強調してくれてありがとう!私はまったく同じ質問を念頭に置いていました。 –

+0

コメントありがとう、Lars - 私は私が唯一だと思っていた。 – Canuck

1

私はOPと同じ問題がありましたが、SearchViewを使用してあきらめているわけではありません。それは完璧な解決策ではありませんが、それはかなりきれいで、うまくいくようです。

OPが述べているように...

私は、独自のクラスからの活動の新しいインスタンスを起動しようとすると、AndroidがFLAG_ACTIVITY_NEW_TASKを尊重していないとスタック

上に新しいタスクをプッシュしていなかった

...ので、私の解決策は、中間アクティビティを経由することです。このために、私はDummyActivityクラスを作成しました。このクラスは基本的にオリジナルのインテントを受け取り、それをあなたのデスティネーションアクティビティに転送します。

だから、私の本来の活動から、代わりに私のマニフェストで

/* 
* Create the intent as normal, but replace our destination Activity with DummyActivity 
*/ 
Intent dummyIntent = new Intent(getActivity(), DummyActivity.class); 

/* 
* This will make it so that if user clicks back from the next activity, they won't be shown DummyActivity 
*/ 
dummyIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 

/* 
* Tell DummyActivity about the destination Activity 
*/ 
dummyIntent.putExtra(DummyActivity.EXTRA_DESTINATION_ACTIVITY, YourDestinationActivity.class); //IMPORTANT - the destination Activity must implement Serializable 

/* 
* If you want, you can add any other extras to dummyIntent (which will be passed through to the destination activity). Launch DummyActivity. 
*/ 
startActivity(dummyIntent); 

...私は呼んで...

Intent destinationIntent = new Intent(getActivity(), DestinationActivity.class); 
startActivity(destinationIntent); 

...呼び出すの、DesinationActivityはsingleTopとして定義されます。

そして、あなたが必要とする必要がある唯一の他の事は、すべての主要なカスタマイズを必要としないはずDummyActivityクラスです...

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 

public class DummyActivity extends Activity { 

    public static final String EXTRA_DESTINATION_ACTIVITY = "uk.co.mobilewebexpert.EXTRA_DESTINATION_ACTIVITY"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.activity_dummy); 

     Intent intent = getIntent(); 

     /* 
     * Get destination activity info 
     */ 
     @SuppressWarnings("unchecked") 
     Class<Activity> destinationActivity = (Class<Activity>) intent.getSerializableExtra(EXTRA_DESTINATION_ACTIVITY); 
     Bundle destinationActivityExtras = intent.getExtras(); 

     /* 
     * Launch destination activity 
     */ 
     Intent destinationActivityIntent = new Intent(this, destinationActivity); 
     destinationActivityIntent.putExtras(destinationActivityExtras); 
     destinationActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(destinationActivityIntent); 
    } 

    /** 
    * Override super.onNewIntent() so that calls to getIntent() will return the latest 
    * intent, rather than the first intent. 
    */ 
    @Override 
    public void onNewIntent(Intent intent){ 
     super.onNewIntent(intent); 
     setIntent(intent); 
    } 

} 

がうまくいけば、これはあまりにも、あなたのために動作します。提案が歓迎されました。乾杯。

関連する問題