当前位置: 首页 > 知识库问答 >
问题:

Android FragmentActivity与(共享?)两个片段之间的Android.Widget.SearchView?

龙学
2023-03-14

我有一个包含两个片段的FragmentActivity(support-v4)。并且都包含一个带有ActionBar的SearchView的菜单。

PlayListFragment:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(LOGTAG, String.format("onCreateOptionsMenu(%s,%s)", this, menu));
    inflater.inflate(R.menu.playlist_ab_menu, menu);
    buildLocalSearchView(menu.findItem(R.id.menu_playlist_search));
    super.onCreateOptionsMenu(menu, inflater);
}
private void buildLocalSearchView(MenuItem item) {
    SearchView searchView = (SearchView) item.getActionView();
    searchView.setSubmitButtonEnabled(false);
    searchView.setIconifiedByDefault(true);
    searchView.setIconified(true);
    //don't work because a bug in android, @see https://code.google.com/p/android/issues/detail?id=25758
    searchView.setOnCloseListener(this);
    //workaround for the above
    MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            return true;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            return true;
        }
    });
    searchView.setOnQueryTextListener(adapter);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(LOGTAG, String.format("onCreateOptionsMenu(%s,%s)", this, menu));
    inflater.inflate(R.menu.filterlist_ab_menu, menu);
    // Get the SearchView and set the searchable configuration
    buildLocalSearchView(menu.findItem(R.id.menu_filterlist_search));
    super.onCreateOptionsMenu(menu, inflater);
}
07-25 05:09:29.277    3315-3315/de.NullZero.ManiDroid D/de.NullZero.ManiDroid.presentation.fragments.FilterListFragment﹕ onDestroyView(FilterListFragment{b12b8090 #2 id=0x7f0a0085 FILTER_2})
07-25 05:09:29.277    3315-3315/de.NullZero.ManiDroid D/PlaylistFragment﹕ onCreate(PlaylistFragment{b13dcc58 #3 id=0x7f0a0085 PLAYLIST},null)
07-25 05:09:29.277    3315-3315/de.NullZero.ManiDroid D/PlaylistFragment﹕ onViewCreated(PlaylistFragment{b13dcc58 #3 id=0x7f0a0085 PLAYLIST},null)
07-25 05:09:29.277    3315-3315/de.NullZero.ManiDroid D/de.NullZero.ManiDroid.presentation.ManiDroidAppActivity﹕ onBackStackChanged() Fragment:PlaylistFragment{b13dcc58 #3 id=0x7f0a0085 PLAYLIST}
07-25 05:09:29.287    3315-3360/de.NullZero.ManiDroid D/DEBUG﹕ searchInPlaylist() = 2 ms
07-25 05:09:29.307    3315-3315/de.NullZero.ManiDroid D/PlaylistFragment﹕ onCreateOptionsMenu(PlaylistFragment{b13dcc58 #3 id=0x7f0a0085 PLAYLIST},com.android.internal.view.menu.MenuBuilder@b106ad90)
07-25 05:09:29.317    3315-3315/de.NullZero.ManiDroid D/PlaylistFragment﹕ onPrepareOptionsMenu(PlaylistFragment{b13dcc58 #3 id=0x7f0a0085 PLAYLIST},com.android.internal.view.menu.MenuBuilder@b106ad90)
07-25 05:09:29.477    3315-3364/de.NullZero.ManiDroid D/DEBUG﹕ searchInFilter(, ManitobaFilter{filterName='Zuletzt gehört'}) = 178 ms
07-25 05:09:29.477    3315-3364/de.NullZero.ManiDroid D/DEBUG﹕ searchInPlaylist(max) = 1 ms

附注。

我找到了原因,但没有解决方法:com.android.internal.widget.ActionBarView.ExpandedActionViewMenuPresenter#CollapseItemActionView

呼叫

    // Do this before detaching the actionview from the hierarchy, in case
    // it needs to dismiss the soft keyboard, etc.
    if (mExpandedActionView instanceof CollapsibleActionView) {
        ((CollapsibleActionView) mExpandedActionView).onActionViewCollapsed();
    }
07-25 05:09:29.477    3315-3364/de.NullZero.ManiDroid D/DEBUG﹕searchInFilter(, ManitobaFilter{filterName='Zuletzt gehört'})
com.android.internal.view.menu.MenuBuilder#restoreActionViewStates

如何禁用ActionBar/SearchView/TextView的保存和还原?

共有1个答案

有耀
2023-03-14
@Override
public void onDestroyView() {
    super.onDestroyView();
    Log.d(LOGTAG, String.format("onDestroyView(%s)", this));
    searchView.setOnQueryTextListener(null);
    searchView.setQuery("", true);
}

这个就行了。因为所有SearchView都具有相同的TextView,因此从相同的bundle-key保存/还原,所以不可能使用多个SearchView。

 类似资料:
  • 在Java中,对于两个JVM(运行在同一台物理机器上),是否有办法使用/共享相同的内存地址空间?假设JVM-1中的生产者将消息放在特定的预定义内存位置,如果JVM-2上的消费者知道要查看哪个内存位置,那么它是否可以检索消息?

  • 问题内容: 我需要在两个(或更多个)组合框之间共享数据,但是我想独立选择元素。例如,如果我在第一个comboBox中选择Object1,则我的第二个ComboBox也选择Object1,因为它们具有相同的模型(DefaultComboBoxModel,并且此模型还管理所选的对象)。但是我不想要这种行为。我想在我的comboBoxes中独立选择对象。当我在第一个comboBox中选择对象时,我的第二

  • 我有一个活动- 。在这个活动中,我有两个片段,这两个片段都是我在xml中以声明方式创建的。 我正在尝试将用户输入的文本的传递到Fragment B 我知道一个片段可以使用获得对其活动的引用。所以我猜我会从那里开始?

  • 我正在试图弄清楚如何在Helm中的两个图表之间共享数据。 在两个图表之间共享configmap的最佳实践是什么?

  • 我有一个人[]有三个人(p1,p2,p3)。Person类有两个属性name和email。 我使用了以下代码。 但我不想这样用。我想使用两个组合框与相同的型号。我尝试使用DefaultComboBoxModel并重写getElementAt()方法,如下所示。 } 问题是如何使用相同的ComboBoxModel在一个JComboBox中添加Person[]的所有名称,并在另一个JComboBox中

  • 我正在考虑重构我的代码,以便将MotionLayout用于动画,但目前它严重依赖于共享元素转换。MotionLayout支持这一点吗? 我似乎在网上找不到任何关于这件事的信息。我发现一条tweet声明MotionLayout不处理活动之间的共享元素转换,但没有关于片段的信息。