编辑文本不会在操作栏中膨胀

时间:2014-05-09 07:15:50

标签: android

我正在尝试使用以下代码将EditText扩展到操作栏

public boolean onCreateOptionsMenu(Menu menu) {
                // TODO Auto-generated method stub
                getMenuInflater().inflate(R.menu.main , menu);
       !! MenuItem mi = menu.getItem(R.id.item2);
                !!EditText et = (EditText) MenuItemCompat.getActionView(mi).findViewById(R.id.editText1);
                et.setOnEditorActionListener(this);
                return super.onCreateOptionsMenu(menu);

备注:标有!!的声明导致应用程序崩溃。 我正在使用minSdk 8。

2 个答案:

答案 0 :(得分:0)

  1. 将android support v7 appcompat库项目添加到您的项目中。
  2. 将属性主题的值更新为android:theme =" @ style / Theme.AppCompat.Light"在您的活动在清单文件中的条目。
  3. 为自定义操作栏创建布局资源

    custom_action_bar.xml

    <EditText
        android:id="@+id/test_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Please enter text here !"
        android:gravity="center_vertical"
        android:padding="5dp"
        android:inputType="text" />
    

  4. 您的活动现在将扩展ActionBarActivity而不是Activity。

  5. 在super()调用之后的活动的onCreate()中,添加以下代码行:

    查看actionBarLayout = getLayoutInflater()。inflate(R.layout.action_bar_layout,null);

    ActionBar actionBar = getSupportActionBar();

    actionBar.setDisplayShowCustomEnabled(true);
    
    actionBar.setCustomView(actionBarLayout);
    
    
    
    
        EditText editText = (EditText) actionBarLayout.findViewById(R.id.test_edit);
        editText.setOnEditorActionListener(new OnEditorActionListener()
        {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
            {
                // TODO Auto-generated method stub
                Log.e("TAG", "key action");
                return false;
            }
        });
    
  6. 替代方案,您可以尝试添加操作视图http://developer.android.com/guide/topics/ui/actionbar.html#ActionView

答案 1 :(得分:0)

尝试将MenuItem与其类(MenuItem))一起投射,使用findItem方法并使用虚增View来检索EditText,如下所示:

// cast the menu item
MenuItem mi = (MenuItem) menu.findItem(R.id.item2);
// Use an inflated view
View view = (View) MenuItemCompat.getActionView(mi);
// Retrieve the edittext
EditText et = (EditText) view.findViewById(R.id.editText1);  

简而言之,作为您的代码,可能会通过以下代码恢复:

MenuItem mi = (MenuItem) menu.getItem(R.id.item2);
EditText et = (EditText) ( (View) MenuItemCompat.getActionView(mi) ).findViewById(R.id.editText1);  

确保以true而不是onCreateOptionsMenu方式返回super 最后,还要确保该项使用如下自定义前缀:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:customapp="http://schemas.android.com/apk/res-auto" >
    <item 
        android:id="@+id/item2"
        customapp:showAsAction="always|collapseActionView"
        customapp:actionLayout="@layout/layout_edittext" ... />
</menu>