Изменение фрагмента из 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 = "";
}