【问题标题】:Actionbar button not showing in searchview android操作栏按钮未在 searchview android 中显示
【发布时间】:2014-06-09 10:29:11
【问题描述】:

我的操作栏上有一个搜索视图和一个按钮,但该按钮仅在横向模式下显示,但我尝试它不会在纵向模式下显示。

横向模式

人像模式

这是我的 menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item  
     android:id="@+id/menu_item_search"
     android:title="Search"
     android:showAsAction="ifRoom"
     android:icon="@android:drawable/ic_menu_search" 
     android:actionViewClass="android.widget.SearchView" />
<item 
     android:id="@+id/submit"
     android:title="submit"
     android:showAsAction="always" /> 
</menu>

这是我的主要活动

public class Myclass extends Activity implements OnQueryTextListener,OnItemClickListener {
GroupAdapter grpAdapter;
public static ArrayList<GroupsModel> arrayOfList;
public static ListView listView;
public static String base_url = "myurl";
private SeekBar volumeControl = null;
private TextView year;
private int progressChanged = 0;
private Menu menu_data;
MenuItem submitBtn;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.two);
    ActionBar actionBar = getActionBar();
    //actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setDisplayShowHomeEnabled(false);
    volumeControl = (SeekBar) findViewById(R.id.volume_bar);
    year = (TextView)findViewById(R.id.year_level);
    volumeControl.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){
            progressChanged = progress;
            year.setText(Integer.toString(progressChanged+7));
        }
        public void onStartTrackingTouch(SeekBar seekBar) {

        }
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });
    arrayOfList = new ArrayList<GroupsModel>();
    listView = (ListView) findViewById(R.id.group_listview);
    listView.setOnItemClickListener(this);
    listView.setTextFilterEnabled(true);

    new ProgressTask(two.this).execute();

}   

private class ProgressTask extends AsyncTask<String, Void, Boolean> { 
    private ProgressDialog dialog;
    @SuppressWarnings("unused")
    private two activity; 
    public ProgressTask(two two) { 
        this.activity = two; 
        context = two; 
        dialog = new ProgressDialog(context);
    }
    private Context context; 
    protected void onPreExecute() { 
        this.dialog.setMessage("Progress start");
        this.dialog.show(); 
    } 
    @Override
    protected void onPostExecute(final Boolean success) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        } 
    }
    protected Boolean doInBackground(final String... args) { 
        //arrayOfList = new ArrayList<GroupsModel>();
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        //params.add(new BasicNameValuePair("",""));
        JSONParser jp = new JSONParser();
        JSONArray groups_obj = jp.makeHttpRequest(base_url + "groups/all", "GET", params);
        for (int i = 0; i < groups_obj.length(); i++) {
            GroupsModel group = new GroupsModel();
            try { 
                JSONObject grp = groups_obj.getJSONObject(i);
                group.setGroupId(grp.getInt("id"));
                group.setGroupname(grp.getString("name"));
                arrayOfList.add(group);
            }
            catch (JSONException e) {
                e.printStackTrace(); 
            }

        }
        two.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                grpAdapter = new GroupAdapter(two.this, R.layout.two_row,arrayOfList);
                listView.setAdapter(grpAdapter);
            }
        });

        return null;
    }
}

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
     menu_data = menu;
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      SearchManager searchManager = (SearchManager) getSystemService( Context.SEARCH_SERVICE );
      SearchView searchView = (SearchView) menu.findItem(R.id.menu_item_search).getActionView();
      searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
      searchView.setSubmitButtonEnabled(false);
      searchView.setOnQueryTextListener(this);
      searchView.setQueryHint("My text");
      searchView.setIconifiedByDefault(false);

      submitBtn = (MenuItem)menu_data.findItem(R.id.submit);
      submitBtn.setIcon(R.drawable.button22);
      submitBtn.setEnabled(false);

      return super.onCreateOptionsMenu(menu);
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
     // Handle item selection
     switch (item.getItemId()) {
     case R.id.submit:
         if(submitBtn.isVisible())
         Toast.makeText(getApplicationContext(), Integer.toString(progressChanged+7),Toast.LENGTH_LONG).show();
         return true;
     default:
         return super.onOptionsItemSelected(item);
     }
 }

 @Override
 public boolean onQueryTextChange(String newText)
 {
      // this is your adapter that will be filtered
      if (TextUtils.isEmpty(newText))
      {
            listView.clearTextFilter();
      }
      grpAdapter.getFilter().filter(newText.toString());  
      return true;
 }

 @Override
 public boolean onQueryTextSubmit(String query) {
  // TODO Auto-generated method stub
  return false;
 }

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
    // TODO Auto-generated method stub
    submitBtn.setIcon(R.drawable.button111);
    submitBtn.setEnabled(true);
    for (GroupsModel s : arrayOfList)
        s.setChecked(false);
    final boolean isChecked = GroupAdapter.items.get(position).getChecked();
    if(isChecked==false){
        GroupAdapter.items.get(position).setChecked(!isChecked);
        grpAdapter.notifyDataSetChanged();
    }
    else{
        GroupAdapter.items.get(position).setChecked(isChecked);
        grpAdapter.notifyDataSetChanged();
    }
}   }

请帮帮我。

【问题讨论】:

  • 您自己添加按钮的任何原因,而不是使用 SearchView 提供的提交按钮?

标签: android android-actionbar android-button searchview


【解决方案1】:

如果您不关心 SearchView 在开始时是折叠的,请尝试像这样配置 SearchView:

 android:showAsAction="collapseActionView|ifRoom"

这应该使操作栏同时显示 SearchView 和您的按钮。此外,当 SearchView 展开时,它只会占用左侧的剩余空间。

【讨论】:

  • 我需要展开搜索视图并显示按钮
  • 您是否尝试过设置 SearchView 的 maxWidth,使其不占用整个空间?或者创建一个包含 SearchView 和您的 Button 的新 ActionView,以便您可以设置宽度以适合操作栏,而无需使用 maxWidth
  • 问题是我需要扩展的搜索视图来填充操作栏,我还需要显示按钮。
  • @sharath, the thing is I need the expanded searchview to fill the action bar and I also need to show the button ?听起来互补
【解决方案2】:

根据developer.android.com

如果您的应用使用支持库来兼容低至 Android 2.1 的版本,则 android: 命名空间中无法使用 showAsAction 属性。相反,此属性由支持库提供,您必须定义自己的 XML 命名空间并将该命名空间用作属性前缀。 (自定义 XML 命名空间应基于您的应用名称,但它可以是您想要的任何名称,并且只能在您声明它的文件范围内访问。)例如:

res/menu/main_activity_actions.xml >>>>

   <menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <!-- Search, should appear as action button -->
    <item android:id="@+id/action_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/action_search"
          yourapp:showAsAction="ifRoom"  />
    ...
 </menu>

【讨论】:

  • 我支持 api 14 到 19,我不支持 android 2.1
【解决方案3】:

在纵向模式下,SearchView 将默认占用大部分(如果不是全部)操作栏。尝试减小 menu.xml 中 SearchView 的大小,看看是否显示按钮。

【讨论】:

  • 是的,当我减小搜索视图的大小时会显示它。但我需要搜索视图的大小来自动调整
  • 自动调整是什么意思?尝试调整这两个项目的大小(宽度和高度),直到达到所需的大小
  • 但是如果我为我的搜索视图设置了所需的宽度(对于特定屏幕尺寸的手机),它是否适用于分辨率较低和分辨率较高的手机?
  • 分辨率应该不会影响searchview的宽度,是指屏幕尺寸吗?
猜你喜欢
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多