これは、単一の「検索」を含む非常に単純Activity
なものです。ActionView を検索ボタンに設定したいので、 を使用して XML レイアウトを渡します。アクションビューとしてアタッチしたいレイアウトを膨らませます。ActionBar
MenuItem
MenuItem.setActionView(int ResId)
MenuItem
はbutton
、まったく同じActivity
. 開発オプションで「アクティビティを保持しない」が設定されています。
問題: OnClickListener がアクション ビュー内のウィジェットに設定された後、ガベージ コレクションが行われMainActivity
ません (以下の MAT を参照)。ただし、(インフレートするのではなく) Java でビュー階層を作成すると、本来あるべき GC になります。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Click");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this, MainActivity.class);
startActivity(i);
}
});
setContentView(button);
}
@SuppressLint("NewApi")
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem searchIcon = menu.add("search");
searchIcon.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
// I set the ActionView here:
searchIcon.setActionView(R.layout.action_search_form);
ViewGroup vg = ((ViewGroup)searchIcon.getActionView());
ImageButton btn = (ImageButton)vg.findViewById(R.id.search_clear_btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();
}
return true;
}
}
オブジェクトの数は、 をクリックした回数と正確に一致しますbutton
。ブロックを削除するとonCreateOptionsMenu()
、オブジェクトの数は正確に 1 ではなく、常に 10 未満になります。