Изменение фрагмента из SearchView submit aka Каскадирование вниз по стопке

В настоящее время я использую объект SearchView, чтобы предоставить возможности моего приложения для предлагаемого ввода.

Этот виджет, однако, при отправке, использует intent-filter для инициирования вашего поиска. Это замечательно, когда мое приложение запускается на телефоне, потому что я хочу сделать вывод результатов поиска Activity, чтобы отобразить ответ. Однако на планшете я хочу, чтобы он загружал мои результаты поиска в фрагмент, расположенный в текущем Activity!

Я хочу, чтобы мое приложение было как можно более унифицированным (с точки зрения кроссовера между телефоном/вкладкой), поэтому вместо того, чтобы перезаписывать поведение отправки, как предложено в этом ответе, я хотел бы начать новую деятельность, которая маршрутизирует поисковый запрос, где он должен идти. На телефоне с результатами Activity, на вкладке я хотел бы передать searchTerm в предыдущую активность.

Итак, я хотел бы спросить - можете ли вы передать информацию предыдущей операции в backstack?

Ответ 1

Я предлагаю вам иметь вашу SearchCatchingActivity, действующую в качестве операции маршрутизации. Он может улавливать запрос и передавать его на требуемую активность (будь то двойная панель с фрагментом результата или одиночная панель с единственным фрагментом результата). Используйте флаг FLAG_ACTIVITY_CLEAR_TOP намерения при маршрутизации к следующему действию, чтобы он стал активностью по умолчанию этого экземпляра. Не забудьте вызвать finish() в своей активности маршрутизации, чтобы удалить его из задней части.

Ответ 2

Я просто установил режим запуска своей активности на singleTop и обработал метод onNewIntent для этого.

AndroidManifest.xml

<activity android:name=".MyActivity" android:launchMode="singleTop" android:theme="@style/Theme.MyTheme" >
    <intent-filter >
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>

    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

MyActivity.java(Это, очевидно, слишком упрощено - вы можете просто использовать общедоступный метод для вашего существующего фрагмента, чтобы передать ему поисковый запрос. В приведенном ниже примере я заменяю его новым фрагментом.)

@Override
protected void onNewIntent (Intent intent) {

    MyFragment newFrag = new MyFragment();
    newFrag.setArguments(args);

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

    // remove previous show list fragment if it exists
    Fragment prev = getSupportFragmentManager().findFragmentByTag("myFrag");
    if (prev != null) {
        ft.remove(prev);
    }
    ft.add(R.id.fragment_placeholder, newFrag, "myFrag");
    ft.commit();

}

Ответ 3

Мое текущее решение (которое является грязным) состоит в том, чтобы иметь общедоступную статическую String в той же Деятельности, которая проверяется при возобновлении Activity, если она найдена, поиск начинается с использованием этого термина, и статическая переменная очищается из.

public class SearchCatchingActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);

    // Ensure this activity isn't in the backstack, notify the previous activity in the backstack that it should handle the search onResume()
    DualPaneActivity.searchTerm = getIntent().getStringExtra(SearchManager.QUERY);
    finish();

}

DualPaneActivity:

if (!searchTerm.equalsIgnoreCase("")) {
    startSearchThread(searchTerm)
    searchTerm = "";
}