アクションバーでEditText をfull で配置する

アクションバーで EditText を横幅いっぱい、つまり、layout_width="match_parent" の表示を行いたい場合、

良く見る教科書どおりの menu の作り方ではなく、RelativeLayout で配置しなければならない。
以下のようなアクションバーの画面を作る場合、、

f:id:posturan:20160313193604p:plain



アクションバー全体のレイアウトを、以下のように用意する。
layout/custom_action.xml


layout/custom_action.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >

        <EditText
            android:id="@+id/urlEditText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="2dp"
            android:layout_weight="1"
            android:imeOptions="actionGo"
            android:inputType="textUri" />

        <ImageButton
            android:id="@+id/closeButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="8dp"
            android:layout_marginTop="6dp"
            android:layout_marginBottom="2dp"
            android:background="@drawable/ic_cancel" />

    </LinearLayout>

</RelativeLayout>


メニュー menu/custom_menu.xml は、以下のとおり

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:id="@+id/url_item
          android:showAsAction="always" 
          android:actionLayout="@layout/custom_action" />

</menu>

Activity の onCreateOptionsMenu の記述では、

@Override
public boolean onCreateOptionsMenu(Menu menu){
   getMenuInflater().inflate(R.menu.custom_menu, menu);
   View view = menu.findItem(R.id.url_item).getActionView();
   mUrlEditText = (EditText)view.findViewById(R.id.urlEditText);
   mUrlEditText.setOnEditorActionListener(new TextView.OnEditorActionListener(){
      @Override
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
         String url = mUrlEditText.getText().toString();
         if (url.startsWith("http")){
            mWebView.loadUrl(url);
         }
         return true;
      }
   });
   *1.setOnClickListener(new View.OnClickListener(){
      @Override
      public void onClick(View v){
         finish();
      }
   });
   return true;
}

*1:ImageButton)view.findViewById(R.id.closeButton