Android - 使整个搜索栏可点击
Android - Make whole search bar clickable
我在片段中使用搜索视图元素来实现搜索功能。
<SearchView
android:id="@+id/search_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="7dp"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"
android:layout_marginBottom="7dp"
android:background="@color/white" />
问题是只有搜索图标可以点击搜索栏中的其他区域是不可点击的,当我点击图标时我只能搜索。
你能帮我把整个搜索区域变成可点击的吗?
可点击是什么意思?触发搜索操作或只是让编辑区域聚焦?如果是第一个,你可以直接让图标clickable=false。并使整个布局可点击并实现事件侦听器。
<SearchView
android:id="@+id/search_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:click="onClick"
android:layout_marginTop="7dp"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"
android:layout_marginBottom="7dp"
android:background="@color/white" />
onClick 方法应该是
public void onClick(View v) {
InputMethodManager im = ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE));
im.showSoftInput(editText, 0);
}
add this to your xml android:iconifiedByDefault="false"
it will keep
open your searchview.
and to clear it add clearfocus
to your searchview object.
search_bar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
search_bar.onActionViewExpanded();
}
});
技巧与其说是让整个区域可点击,不如说是展开它然后隐藏键盘。
首先,您在 XML 中的布局很好,保持原样,在您的 Java 中,您希望具有以下内容:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
//Define your Searchview
SearchView searchView = (SearchView) findViewById(R.id.search_bar);
//Turn iconified to false:
searchView.setIconified(false);
//The above line will expand it to fit the area as well as throw up the keyboard
//To remove the keyboard, but make sure you keep the expanded version:
searchView.clearFocus();
}
这样做的目的是将键盘扩展到整个区域的长度,它专注于它,这使得整个区域都可以点击,然后它移除了键盘,这样在用户看来就像他们能够单击该字段并调出键盘。
应该可以实现您的要求。
-锡尔
这可以通过在 SearchView 的 OnClick 上将 Iconified 设置为 false 来简单地完成。
searchBar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
searchBar.setIconified(false);
}
});
参考:Eric Lui's answer
希望对您有所帮助。
更新:
您也可以直接在您的XML
中使用它
app:iconifiedByDefault="false"
searchView.setIconified(false);
在您的 Java 文件中写入下面给出的代码行:
SearchView searchView = (SearchView) findViewById(R.id.searchView);
searchView.setQueryHint("Enter your address");
searchView.setIconified(false);
searchView.clearFocus();
之后,不要忘记在 SearchView
标签内的 XML 文件中写入 android:focusable="true"
。
例如:
<SearchView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true" />
使用这个
searchView.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
searchView.onActionViewExpanded();
OR
searchView.setIconified(false);
}
});
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener()
{
@Override
public void onFocusChange(View view, boolean b)
{
if(!b)
{
if(searchView.getQuery().toString().length() < 1)
{
searchView.setIconified(true); //close the search editor and make search icon again
OR
searchView.onActionViewCollapsed();
}
searchView.clearFocus();
}
}
});
对于 android 的最新版本 -
尝试:
app:iconifiedByDefault="false"
示例 -
<android.support.v7.widget.SearchView
android:id="@+id/source_location_search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="15dp"
android:layout_marginRight="20dp"
app:iconifiedByDefault="false"
app:queryHint="Your hint text" />
在代码中:
private void initSearchView(View layout) {
// Locate the EditText in listview_main.xml
searchInput = (SearchView) layout.findViewById(R.id.search);
//searchInput.onActionViewExpanded();//force show keyboard at start
//==>region to enable search after click in input-text(not only at magnifier icon)
searchInput.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
searchInput.onActionViewExpanded();
}
});
searchInput.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (!b) {
if (searchInput.getQuery().toString().length() < 1) {
searchInput.setIconified(true);
}
searchInput.clearFocus();
}
}
});
//endregion
}
在我的布局中:
<androidx.appcompat.widget.SearchView
android:id="@+id/search"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/toolbar_main"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="2dp"
android:background="@drawable/search_border"
android:inputType="text"
android:layoutDirection="ltr"
android:searchSuggestThreshold="2"
app:queryHint="@string/search"
app:searchHintIcon="@null" />
使用下面的代码。
<androidx.appcompat.widget.SearchView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/earningSearchView"
app:queryHint="Search"
app:iconifiedByDefault="false"
app:queryBackground="@android:color/transparent"/>
所以最近我不得不这样做,我尝试了所有提供的答案,但每个答案都有一些狡猾的行为 - 例如 x
close/erase all 按钮只会出现,如果你' d 单击搜索图标,否则您将能够进行编辑等操作,但您只会看到 x
作为擦除所有按钮。
查看 SearchView
的代码,我注意到单击 mSearchButton
会调用 onSearchClicked()
而不是建议的 onActionViewExpanded()
,但前者是包私有函数所以不能直接调用。所以我想到了这个:
private val searchButton by lazy { searchView.findViewById<ImageView>(R.id.search_button) }
searchView.setOnClickListener { searchButton.callOnClick() }
这样,无论您点击哪里,您都可以获得相同的行为,并且您不需要在 xml 中或以编程方式手动设置 iconified
属性。
就写在xml
android:iconifiedByDefault="false"
为我工作
我在片段中使用搜索视图元素来实现搜索功能。
<SearchView
android:id="@+id/search_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="7dp"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"
android:layout_marginBottom="7dp"
android:background="@color/white" />
问题是只有搜索图标可以点击搜索栏中的其他区域是不可点击的,当我点击图标时我只能搜索。
你能帮我把整个搜索区域变成可点击的吗?
可点击是什么意思?触发搜索操作或只是让编辑区域聚焦?如果是第一个,你可以直接让图标clickable=false。并使整个布局可点击并实现事件侦听器。
<SearchView
android:id="@+id/search_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:click="onClick"
android:layout_marginTop="7dp"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"
android:layout_marginBottom="7dp"
android:background="@color/white" />
onClick 方法应该是
public void onClick(View v) {
InputMethodManager im = ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE));
im.showSoftInput(editText, 0);
}
add this to your xml
android:iconifiedByDefault="false"
it will keep open your searchview.and to clear it add
clearfocus
to your searchview object.
search_bar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
search_bar.onActionViewExpanded();
}
});
技巧与其说是让整个区域可点击,不如说是展开它然后隐藏键盘。
首先,您在 XML 中的布局很好,保持原样,在您的 Java 中,您希望具有以下内容:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
//Define your Searchview
SearchView searchView = (SearchView) findViewById(R.id.search_bar);
//Turn iconified to false:
searchView.setIconified(false);
//The above line will expand it to fit the area as well as throw up the keyboard
//To remove the keyboard, but make sure you keep the expanded version:
searchView.clearFocus();
}
这样做的目的是将键盘扩展到整个区域的长度,它专注于它,这使得整个区域都可以点击,然后它移除了键盘,这样在用户看来就像他们能够单击该字段并调出键盘。
应该可以实现您的要求。
-锡尔
这可以通过在 SearchView 的 OnClick 上将 Iconified 设置为 false 来简单地完成。
searchBar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
searchBar.setIconified(false);
}
});
参考:Eric Lui's answer
希望对您有所帮助。
更新:
您也可以直接在您的XML
中使用它app:iconifiedByDefault="false"
searchView.setIconified(false);
在您的 Java 文件中写入下面给出的代码行:
SearchView searchView = (SearchView) findViewById(R.id.searchView);
searchView.setQueryHint("Enter your address");
searchView.setIconified(false);
searchView.clearFocus();
之后,不要忘记在 SearchView
标签内的 XML 文件中写入 android:focusable="true"
。
例如:
<SearchView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true" />
使用这个
searchView.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
searchView.onActionViewExpanded();
OR
searchView.setIconified(false);
}
});
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener()
{
@Override
public void onFocusChange(View view, boolean b)
{
if(!b)
{
if(searchView.getQuery().toString().length() < 1)
{
searchView.setIconified(true); //close the search editor and make search icon again
OR
searchView.onActionViewCollapsed();
}
searchView.clearFocus();
}
}
});
对于 android 的最新版本 - 尝试:
app:iconifiedByDefault="false"
示例 -
<android.support.v7.widget.SearchView
android:id="@+id/source_location_search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="15dp"
android:layout_marginRight="20dp"
app:iconifiedByDefault="false"
app:queryHint="Your hint text" />
在代码中:
private void initSearchView(View layout) {
// Locate the EditText in listview_main.xml
searchInput = (SearchView) layout.findViewById(R.id.search);
//searchInput.onActionViewExpanded();//force show keyboard at start
//==>region to enable search after click in input-text(not only at magnifier icon)
searchInput.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
searchInput.onActionViewExpanded();
}
});
searchInput.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (!b) {
if (searchInput.getQuery().toString().length() < 1) {
searchInput.setIconified(true);
}
searchInput.clearFocus();
}
}
});
//endregion
}
在我的布局中:
<androidx.appcompat.widget.SearchView
android:id="@+id/search"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/toolbar_main"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="2dp"
android:background="@drawable/search_border"
android:inputType="text"
android:layoutDirection="ltr"
android:searchSuggestThreshold="2"
app:queryHint="@string/search"
app:searchHintIcon="@null" />
使用下面的代码。
<androidx.appcompat.widget.SearchView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/earningSearchView"
app:queryHint="Search"
app:iconifiedByDefault="false"
app:queryBackground="@android:color/transparent"/>
所以最近我不得不这样做,我尝试了所有提供的答案,但每个答案都有一些狡猾的行为 - 例如 x
close/erase all 按钮只会出现,如果你' d 单击搜索图标,否则您将能够进行编辑等操作,但您只会看到 x
作为擦除所有按钮。
查看 SearchView
的代码,我注意到单击 mSearchButton
会调用 onSearchClicked()
而不是建议的 onActionViewExpanded()
,但前者是包私有函数所以不能直接调用。所以我想到了这个:
private val searchButton by lazy { searchView.findViewById<ImageView>(R.id.search_button) }
searchView.setOnClickListener { searchButton.callOnClick() }
这样,无论您点击哪里,您都可以获得相同的行为,并且您不需要在 xml 中或以编程方式手动设置 iconified
属性。
就写在xml
android:iconifiedByDefault="false"
为我工作