在Android 3.0後的版本,硬體Menu鍵會消失
進而轉變成Contextual Menu
設計了一款利用PopupWindow模擬的menu,可以相容於API 10以上(應該可以更低,不過我懶得去一一查)
我先把code列出來,以後在整理註解囉(pixnet對code的排列不是很友善 Orz)
以下就是code
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
public class ContextualMenuWindow extends PopupWindow implements OnItemClickListener
{
private LinearLayout llMenuContainer;
private ListView lvMenu;
private List<IntentMenuItem> menuItems = new ArrayList<IntentMenuItem>();
private Activity activity;
private void createUI()
{
llMenuContainer = new LinearLayout(activity);
lvMenu = new ListView(activity);
LayoutParams params = new LayoutParams(200, LayoutParams.WRAP_CONTENT);
lvMenu.setLayoutParams(params);
llMenuContainer.addView(lvMenu);
}
private void loadUI()
{
llMenuContainer = (LinearLayout)activity.getLayoutInflater().inflate(R.layout.contextual_menu, null);
lvMenu = (ListView)llMenuContainer.findViewById(R.id.lvMenu);
}
public ContextualMenuWindow(Activity activity)
{
super(activity);
this.activity = activity;
//createUI();
loadUI();
ArrayAdapter<IntentMenuItem> listItemAdapter = new ArrayAdapter<IntentMenuItem>(activity, android.R.layout.simple_list_item_1, menuItems);
lvMenu.setAdapter(listItemAdapter);
lvMenu.setOnItemClickListener(this);
setContentView(llMenuContainer);
setFocusable(true);
setWindowLayoutMode(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
}
public void addIntentItem(String label, Intent intent, int requestCode)
{
menuItems.add(new IntentMenuItem(label, intent, requestCode));
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
this.dismiss();
IntentMenuItem item = menuItems.get(position);
if(item.requestCode >= 0)
activity.startActivityForResult(item.intent, item.requestCode);
else
activity.startActivity(item.intent);
}
class IntentMenuItem
{
String label;
Intent intent;
int requestCode = -1;
public IntentMenuItem(String label, Intent intent, int requestCode)
{
this.label = label;
this.intent = intent;
this.requestCode = requestCode;
}
@Override
public String toString()
{
return label;
}
}
}