アクションバーで EditText を横幅いっぱい、つまり、layout_width="match_parent" の表示を行いたい場合、
良く見る教科書どおりの menu の作り方ではなく、RelativeLayout で配置しなければならない。
以下のようなアクションバーの画面を作る場合、、
アクションバー全体のレイアウトを、以下のように用意する。
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