这可以视为本课题的延伸
我已经在代码中添加了以下内容来获取searchView Widget
RES /菜单/ main_activity_actions.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Search, should appear as action button -->
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
android:showAsAction="always"
android:actionViewClass="android.support.v7.widget.SearchView" />
<!-- Settings, should always be in the overflow -->
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:showAsAction="never" />
</menu>
Run Code Online (Sandbox Code Playgroud)
Mainactivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is …Run Code Online (Sandbox Code Playgroud) 我已经使用 ActionBar 选项卡实现了两个片段。我正在使用夏洛克碎片。当我开始一个片段时,我在操作栏上创建了一个搜索视图。
问题是:当我在第一个片段上搜索某些内容并且没有关闭搜索视图或删除文本时,我移动到下一个片段,我得到一个折叠的搜索视图,这很好。但是当我再次回到我的第一个片段时,我看到一个像以前一样排序的列表,但搜索视图已折叠。取回原始列表的唯一方法是单击一次搜索视图并将其关闭。
当我移动到第二个片段时如何重置第一个片段上的搜索视图,或者当我来到第一个片段时如何保持搜索视图打开?
任何一种解决方案都可以。
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
>
<item android:id="@+id/action_search"
android:title="search"
android:icon="@drawable/search"
android:orderInCategory="100"
android:showAsAction="always|collapseActionView"
android:actionViewClass="com.actionbarsherlock.widget.SearchView" />
</menu>
Run Code Online (Sandbox Code Playgroud)
这就是我在片段中膨胀的方式
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.main, menu);
SearchView sv = (SearchView)getActivity().findViewById(R.id.action_search);
sv.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
//...
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
bindingData.resetData();
bindingData.getFilter().filter(newText.toString());
return false;
}
});
}
Run Code Online (Sandbox Code Playgroud) 我只是一个初学者,我在这里搜索了这个问题,发现4-5问题但是没有帮助我.我只是在Actionbar中尝试searchView,我的活动是AppCompatActivity我的代码在下面.我在这个活动中使用工具栏.并使用这个库.OncreatOptionMenu:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
SearchManager SManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
SearchView searchViewAction = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
searchViewAction.setSearchableInfo(SManager.getSearchableInfo(getComponentName()));
searchViewAction.setIconifiedByDefault(false);
return super.onCreateOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)
XML:
<item android:id="@+id/action_search"
android:title="action_search"
MainActivity:showAsAction="ifRoom"
MainActivity:actionViewClass="android.support.v7.widget.SearchView" />
Run Code Online (Sandbox Code Playgroud)
和logcat:
java.lang.NullPointerException
at algonation.com.spm.MainActivity.onCreateOptionsMenu(MainActivity.java:183)
at android.app.Activity.onCreatePanelMenu(Activity.java:2571)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:277)
at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:84)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallback.onCreatePanelMenu(AppCompatDelegateImplBase.java:251)
at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:84)
at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:449)
at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:66)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5292)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
如果你需要MainActivity的完整代码,请告诉我..非常感谢你.
我正在尝试将搜索图标添加到工具栏,按下该图标将打开搜索栏。
但我尝试的每种方法都不起作用,并且没有图标出现。现在我收到此错误,但找不到解决方案:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setOnQueryTextListener(android.support.v7.widget.SearchView$OnQueryTextListener)' on a null object reference
at pl.michalz.hideonscrollexample.activity.partthree.PartThreeActivity.onCreateOptionsMenu(PartThreeActivity.java:62)
Run Code Online (Sandbox Code Playgroud)
这是我的主要活动:
public class PartThreeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppThemeBlue);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_part_three);
initToolbar();
initViewPagerAndTabs();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem seachItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView)
MenuItemCompat.getActionView(seachItem);
searchView.setOnQueryTextListener(
new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextSubmit(String query) {
Log.d("myApp", …Run Code Online (Sandbox Code Playgroud) 我创建了一个小例子来展示我的问题。主布局,工具栏中有 SearchView 和 3 个按钮: 1) 设置文本 - 展开搜索视图并设置查询 2) 展开 - 展开搜索视图 3) 折叠 - 折叠搜索视图
Activity_main.xml
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context="com.porn.MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="368dp"
android:layout_height="wrap_content"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="0dp">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:contentInsetStartWithNavigation="0dp">
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<Button
android:id="@+id/setTextBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Set text" />
<Button
android:id="@+id/expandBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Expand" />
<Button
android:id="@+id/collapseBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Collapse" />
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
MainActivity.java
public class MainActivity extends AppCompatActivity {
private MenuItem toolbarSearchMenuItem;
private SearchView toolbarSearchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); …Run Code Online (Sandbox Code Playgroud) 我正在使用Android SearchView在我的操作栏中有一个搜索按钮.我在YouTube上关注了谷歌开发者的这个教程,并根据自己的需要添加了一些调整.但是,每当我退出单击按钮时出现的搜索字段时,搜索按钮就会消失!
这是我的onCreateOptionsMenu和onOptionsItemSelected函数
onCreateOptionsMenu:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
Run Code Online (Sandbox Code Playgroud)
onOptionsItemSelected:
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch (id) {
case R.id.action_settings:
// …Run Code Online (Sandbox Code Playgroud) 我尝试实现一个SearchViewin ToolBar. 当我尝试使用此选项提交查询时,提交按钮位于ToolBar. 但是,我需要SearchView.
我怎样才能定制SearchView?
我收到“OnQueryTextListener 需要类型不匹配!” 尝试在导航片段中用 Kotlin 实现 searchview 时出错。我已经搜索了尽可能多的示例和 stackoverflow 问题,一切都表明我的代码应该是正确的。请注意,我的搜索视图是持久的(不是菜单的一部分),因此我无法执行 menu.finditem。
这是我的 HomeFragment 代码:
class HomeFragment : Fragment() {
private lateinit var homeViewModel: HomeViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_home, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
println("***************** Home Fragment *******************")
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
// task HERE
return false
}
override fun onQueryTextChange(newText: String): Boolean {
return false
}
})
}
Run Code Online (Sandbox Code Playgroud)
和布局代码:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" …Run Code Online (Sandbox Code Playgroud) 我使用以下代码片段在SearchView小部件中查找TextView.
int autoCompleteTextViewID = getResources().getIdentifier("android:id/search_src_text", null, null);
mQueryTextView = (AutoCompleteTextView) searchView.findViewById(autoCompleteTextViewID);
Run Code Online (Sandbox Code Playgroud)
但是,当切换到android.support.v7.appcompat支持库时,它不再起作用.
我想这是因为支持库不使用android:"android:id/search_src_text"的前缀,但我不知道它应该是什么.我试过了
getResources().getIdentifier("android.support.v7.appcompat:id/search_src_text", null, null);
Run Code Online (Sandbox Code Playgroud)
PS更多代码片段:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// this xml has funshion:actionViewClass="android.support.v7.widget.SearchView"
getMenuInflater().inflate(R.menu.search_activity_actions_v7, menu);
android.support.v7.widget.SearchView searchView = (android.support.v7.widget.SearchView)
MenuItemCompat.getActionView(menu.findItem(R.id.action_search_v7));
if (searchView==null){
FSLogcat.e(TAG, "searchView is null!");
}else{
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
//searchView.requestFocus();
searchView.setSubmitButtonEnabled(true);
findSearchViewTextView(searchView);
updateSearchViewText();
}
return super.onCreateOptionsMenu(menu);
}
private void findSearchViewTextView(View searchView) {
int autoCompleteTextViewID = getResources().getIdentifier("android:id/search_src_text", null, null);
mQueryTextView = (AutoCompleteTextView) searchView.findViewById(autoCompleteTextViewID);
}
private void updateSearchViewText() …Run Code Online (Sandbox Code Playgroud) android 4.3.
片段:
<android.support.v7.widget.SearchView
android:id="@+id/searchView"
style="@style/Widget.AppCompat.SearchView.ActionBar"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_marginEnd="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginStart="20dp"
android:background="@drawable/search_view_bg"
android:imeOptions="actionDone"
android:maxLines="1"
android:inputType="text"
android:theme="@style/SearchViewTheme"
app:defaultQueryHint="@null"
app:layout_constraintLeft_toLeftOf="@+id/searchViewContainer"
app:layout_constraintRight_toRightOf="@+id/searchViewContainer"
app:layout_constraintTop_toTopOf="@+id/searchViewContainer"
app:searchHintIcon="@null" />
Run Code Online (Sandbox Code Playgroud)
我想在点击SearchView时显示键盘上的Done按钮.所以我设置android:imeOptions="actionDone".但它没有帮助:
结果如下: