2013-02-09 79 views
5

我有一個活動,我通常希望存在於多個任務中,以便[返回]按鈕恢復以前的狀態;不過,我還想在現有活動中使用​​,而不是將新的任務推入任務堆棧(因爲我想搜索當前顯示的內容)。這裏是我的問題:如何在沒有singleTop的情況下使用Android SearchView?

  • 如果我設置了活動的啓動模式爲「singleTop」,則搜索查看工作與當前的活動,但Context.startActivity不增加新的活動堆棧。
  • 如果我將活動的啓動模式設置爲「標準」,startActivity會向堆棧添加新活動,但SearchView還會創建新的(空)活動,而不是搜索現有活動。

我找不到任何辦法使搜索查看使用意圖的標誌(如FLAG_ACTIVITY_SINGLE_TOP。我試着去周圍的其他方法,設置啓動模式爲「singleTop」,然後添加FLAG_ACTIVITY_NEW_TASK每一個意圖,但是,只有當啓動工作來自不同的活動類別;當我嘗試從自己的類中啓動一個活動的新實例時,Android並不尊重FLAG_ACTIVITY_NEW_TASK,也沒有將新任務推送到堆棧上

也許有些事情我可以做在Activity.onNewIntent強制活動克隆自己然後

我快要givin儘管事實上「從Android 3.0開始,在操作欄中使用SearchView小部件作爲項目是在您的應用中提供搜索的首選方式」Source) - 到目前爲止,它似乎太不靈活和不可配置,在非平凡的情況下非常有用。

有沒有人找到解決這個問題的辦法?

+0

從完全沒有答覆(和少量的意見),我會猜測這是一個不平凡的問題。還有一種可能的解決方法(除了避免使用SearchView):我可以設計singleTop Activity來維護自己的狀態堆棧和開關狀態,然後攔截Back按鈕以模擬在任務堆棧中移動。不過,我強烈反感用模擬取代核心操作系統的功能 - 如果這是唯一的選擇,我只會決定谷歌建議SearchView提前用於生產使用,並將創建我自己的搜索操作組件。 – Canuck 2013-02-11 13:46:29

回答

4

經過大量的反思和錯誤的開始,我意識到SearchView對於這項任務來說是錯誤的。 Google設計的SearchView具有一種非常特定的搜索活動類型:

  • 用戶鍵入搜索查詢。
  • 該應用推送顯示結果列表的新活動。

這不是我正在使用的搜索模型;相反,我想使用查詢來改進當前顯示在屏幕上的列表 - 它比過濾查詢更適合查詢和響應模型。 SearchView不是爲此設計的,所以我繼續編寫自己的小部件(並將其綁定到搜索菜單項和搜索按鈕)。

我很驚訝沒有人對這個問題有任何評論 - 通常Android的問題引發了很多討論。我想這是太遙遠了。

+1

我想知道是否可以使用SearchView來過濾已經可見的項目!感謝您強調,SearchView旨在開始另一項操作!我腦子裏有完全相同的問題。 – 2013-02-27 21:23:56

+0

感謝您的評論,拉斯 - 我開始認爲我是唯一一個。 – Canuck 2013-02-28 01:13:17

1

我和OP有同樣的問題,但有一個解決方案,並不意味着放棄使用SearchView。這不是完美的解決方案,但它相當乾淨,似乎運作良好。

正如OP所述......

,當我嘗試推出從它自己的類活動的新實例,Android的不尊重FLAG_ACTIVITY_NEW_TASK並沒有推新的任務壓入堆棧

...所以我解決方案是通過中介活動去。爲此,我創建了一個DummyActivity類,該類基本上採用原始意圖並將其轉發到目標活動。所以從我原來的活動,而不是調用...

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

...我叫......

/* 
* 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); 

在我的清單

,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); 
    } 

} 

希望這會爲你工作了。建議歡迎。乾杯。

相關問題