Qt On android下拉菜单实现 怎么实现菜单

21ic官方微信
Qt on Android:使用JNI与第三方jar包
if(m_nativeNotify == null){
m_nativeNotify = new ExtendsQtNative();
m_nativeNotify.OnDownloaded(result, uri, data);
ExtendsQtNative.java:
7package an.qt.useJ
import java.lang.S
public class ExtendsQtNative
public native void OnDownloaded(int result, String url, String content);
基本思路是酱紫的:
Qt调用java的downloadWebPage,Java代码使用asynchttpclient下载一个网页,然后调用ExtendsQtNative通知Qt
分两部分,一部分是实现JNI方法。另一部分是调用Java类的方法。
实现JNI方法并注册
先看与ExtendsQtNative对应的JNI实现,在main.cpp中,都列出吧:
61#include widget.h
#include ../simpleCustomEvent.h
QObject *g_listener = 0;
// result: -1 1 0
static void onDownloaded(JNIEnv *env, jobject thiz,int result, jstring uri,
jstring data)
QString qstrD
const char *nativeString = env-&GetStringUTFChars(data, 0);
qstrData = nativeS
env-&ReleaseStringUTFChars(data, nativeString);
QCoreApplication::postEvent(g_listener, new SimpleCustomEvent(result,
qstrData));
bool registerNativeMethods()
JNINativeMethod methods[] {
{OnDownloaded, (ILjava/lang/SLjava/lang/S)V,
(void*)onDownloaded}
const char *classname = an/qt/useJar/ExtendsQtN
QAndroidJniE
QAndroidJniObject javaClass(classname);
clazz = env-&GetObjectClass(javaClass.object());
qDebug() && find ExtendsQtNative - &&
bool result =
jint ret = env-&RegisterNatives(clazz,
sizeof(methods) / sizeof(methods[0]));
env-&DeleteLocalRef(clazz);
qDebug() && RegisterNatives return - &&
result = ret &= 0;
if(env-&ExceptionCheck()) env-&ExceptionClear();
int main(int argc, char *argv[])
QApplication a(argc, argv);
SimpleCustomEvent::eventType();
registerNativeMethods();
g_listener = qobject_cast
return a.exec();
注册JNI方法,设置一个全局的对象接收通知。具体的,参考Qt帮助来理解。
调用Java方法
对Java方法的调用在Widget.cpp中。直接看代码吧。
widget.h:
29#ifndef WIDGET_H
#define WIDGET_H
class Widget : public QWidget
Widget(QWidget *parent = 0);
~Widget();
bool event(QEvent *e);
public slots:
void onGet();
QLineEdit * m_urlE
QTextEdit * m_resultV
QLabel * m_stateL
#endif // WIDGET_H
都是界面相关的,没什么好说的。看widget.cpp:
71#include widget.h
#include ../simpleCustomEvent.h
Widget::Widget(QWidget *parent)
: QWidget(parent)
QVBoxLayout *layout = new QVBoxLayout(this);
在今天凌晨1点开幕的I/O大会Keynote结束之后,Google在一辆玛莎拉蒂Ghibli上演示Android Auto的最新研究成果,而最终目的就是将汽车当做智能手机来发展,通过开源等方式让传统汽车厂商成为OEM。Google联合高通公......关键字:
iPhone SE这样的价格,谁还买3000左右的Android机?
......关键字:
作为Android的鼻祖,祝HTC好运吧。
......关键字:
在谷歌的收购历史上,买下Android应该是最精彩的一宗交易。现在Android已经成为世界上最流行的操作系统,超越了Windows......关键字:
市场研究公司IDC周四发布报告称,2015年很可能是全球智能机市场实现两位数增长的最后一年。......关键字:Android开发之多级下拉列表菜单实现(仿美团,淘宝等)
我们在常用的电商或者旅游APP中,例如美团,手机淘宝等等,都能够看的到有那种下拉式的二级列表菜单。具体如图所示:
上面两张图就是美团的一个二级列表菜单的一个展示。我相信很多人都想开发一个跟它一样的功能放到自己的APP中。好,接下来我们就开始动手,解决它。
vcD4KPGgyPjGjrL3hubm31s72PC9oMj4KPHA+ytfPyKOsztLDx7j4s/bV4rj2z8LAtLLLtaXQ6NKqtcTX6b2ooaPO0sPH08PP37/yzbzAtLfWzvahozwvcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/9.jpg" width="600" alt="\">
1)如上图所示,最外围的是一个Activity,顶部包含了一个View的容器,这个容器主要是装载ToggleButton来实现诸如美团里面的“美食,全城,理我最近,刷选”这一行。这一行一点就会弹出对应的下来菜单。
2)下拉菜单是如何实现的呢?,这里我们利用了PopupWindow来实现这一弹出式窗口。然后我们在弹出式窗口里面再定义我们的下来列表项,是单列还是二级菜单,都是由里面来定。
3)不同的菜单,需要一级或者需要二级,在这里根据我的需求而变动。我们在PopupWindow上面加一个自定义的LeftView,或者是MiddleView,RightView。主要是一个ToggleButton,你弹出一个窗口,你就定制一个窗口。
3)视图里面嵌入ListView,就形成了列表项。
好分析就到上面为止,接下来我们一步步的说明实现。
2,项目结构
本项目的项目结构如图所示:
1) Adapter。适配器,主要是为ListView提供数据适配的。
2)MainActivity。主活动页面。
3)ExpandTabView。本项目的核心类,它包含ToggleButton容器和PopupWindow,是控制弹出窗口的核心类。
4)ViewLeft,ViewMiddle,ViewRight。是弹出里面嵌套的类,实现不同的列表菜单。
3,MainActivity
承载所有元素。看代码比看文字实在。
package com.example.
import java.util.ArrayL
import android.app.A
import android.os.B
import android.util.L
import android.view.V
import android.widget.T
import com.example.view.ExpandTabV
import com.example.view.ViewL
import com.example.view.ViewM
import com.example.view.ViewR
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private ExpandTabView expandTabV
private ArrayList mViewArray = new ArrayList();
private ViewLeft viewL
private ViewMiddle viewM
private ViewRight viewR
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initVaule();
initListener();
private void initView() {
Log.d(TAG,"initView");
expandTabView = (ExpandTabView) findViewById(R.id.expandtab_view);
viewLeft = new ViewLeft(this);
viewMiddle = new ViewMiddle(this);
viewRight = new ViewRight(this);
private void initVaule() {
Log.d(TAG,"initValue");
mViewArray.add(viewLeft);
mViewArray.add(viewMiddle);
mViewArray.add(viewRight);
ArrayList mTextArray = new ArrayList();
mTextArray.add("距离");
mTextArray.add("区域");
mTextArray.add("距离");
expandTabView.setValue(mTextArray, mViewArray);//将三个下拉列表设置进去
expandTabView.setTitle(viewLeft.getShowText(), 0);
expandTabView.setTitle(viewMiddle.getShowText(), 1);
expandTabView.setTitle(viewRight.getShowText(), 2);
private void initListener() {
Log.d(TAG,"initListener");
viewLeft.setOnSelectListener(new ViewLeft.OnSelectListener() {
public void getValue(String distance, String showText) {
Log.d("ViewLeft", "OnSelectListener, getValue");
onRefresh(viewLeft, showText);
viewMiddle.setOnSelectListener(new ViewMiddle.OnSelectListener() {
public void getValue(String showText) {
Log.d("ViewMiddle","OnSelectListener, getValue");
onRefresh(viewMiddle,showText);
viewRight.setOnSelectListener(new ViewRight.OnSelectListener() {
public void getValue(String distance, String showText) {
Log.d("ViewRight","OnSelectListener, getValue");
onRefresh(viewRight, showText);
private void onRefresh(View view, String showText) {
Log.d(TAG,"onRefresh,view:"+view+",showText:"+showText);
expandTabView.onPressBack();
int position = getPositon(view);
if (position >= 0 && !expandTabView.getTitle(position).equals(showText)) {
expandTabView.setTitle(showText, position);
Toast.makeText(MainActivity.this, showText, Toast.LENGTH_SHORT).show();
private int getPositon(View tView) {
Log.d(TAG,"getPosition");
for (int i = 0; i < mViewArray.size(); i++) {
if (mViewArray.get(i) == tView) {
return -1;
public void onBackPressed() {
if (!expandTabView.onPressBack()) {
4 ,ExpandTabView
最主要就是如何处理当我们点击这些ToggleButton的时候要弹出或者收起这些PopupWindow。
package com.example.
import java.util.ArrayL
import com.example.expandtabview.R;
import android.app.A
import android.content.C
import android.util.AttributeS
import android.util.L
import android.view.LayoutI
import android.view.V
import android.widget.LinearL
import android.widget.PopupW
import android.widget.PopupWindow.OnDismissL
import android.widget.RelativeL
import android.widget.TextV
import android.widget.ToggleB
* 菜单控件头部,封装了下拉动画,动态生成头部按钮个数
* @author zengjinlong
public class ExpandTabView extends LinearLayout implements OnDismissListener {
private static final String TAG = "ExpandTabView";
private ToggleButton selectedB
private ArrayList mTextArray = new ArrayList();
private ArrayList mViewArray = new ArrayList();
private ArrayList mToggleButton = new ArrayList();
private Context mC
private final int SMALL = 0;
private int displayW
private int displayH
private PopupWindow popupW
private int selectP
public ExpandTabView(Context context) {
super(context);
init(context);
public ExpandTabView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
* 根据选择的位置设置tabitem显示的值
public void setTitle(String valueText, int position) {
if (position < mToggleButton.size()) {
mToggleButton.get(position).setText(valueText);
public void setTitle(String title){
* 根据选择的位置获取tabitem显示的值
public String getTitle(int position) {
if (position < mToggleButton.size() && mToggleButton.get(position).getText() != null) {
return mToggleButton.get(position).getText().toString();
return "";
* 设置tabitem的个数和初始值
* @param textArray 标题数组
* @param viewArray 控件数组
public void setValue(ArrayList textArray, ArrayList viewArray) {
if (mContext == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Log.d(TAG,"setValue");
mTextArray = textA
for (int i = 0; i < viewArray.size(); i++) {
final RelativeLayout r = new RelativeLayout(mContext);
int maxHeight = (int) (displayHeight * 0.7);
RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, maxHeight);
rl.leftMargin = 10;
rl.rightMargin = 10;
r.addView(viewArray.get(i), rl);
mViewArray.add(r);
r.setTag(SMALL);
ToggleButton tButton = (ToggleButton) inflater.inflate(R.layout.toggle_button, this, false);
addView(tButton);
View line = new TextView(mContext);
line.setBackgroundResource(R.drawable.choosebar_line);
if (i < viewArray.size() - 1) {
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(2, LinearLayout.LayoutParams.MATCH_PARENT);
addView(line, lp);
mToggleButton.add(tButton);
tButton.setTag(i);
tButton.setText(mTextArray.get(i));
r.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Log.d("RelativeLayout","view:"+v);
onPressBack();
r.setBackgroundColor(mContext.getResources().getColor(R.color.popup_main_background));
tButton.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
Log.d("tButton","setOnClickListener(l)");
// initPopupWindow();
ToggleButton tButton = (ToggleButton)
if (selectedButton != null && selectedButton != tButton) {
selectedButton.setChecked(false);
selectedButton = tB
selectPosition = (Integer) selectedButton.getTag();
startAnimation();
if (mOnButtonClickListener != null && tButton.isChecked()) {
mOnButtonClickListener.onClick(selectPosition);
private void startAnimation() {
Log.d(TAG,"startAnimation");
if (popupWindow == null) {
Log.d(TAG,"startAnimation(),new popupWindow now");
popupWindow = new PopupWindow(mViewArray.get(selectPosition), displayWidth, displayHeight);
popupWindow.setAnimationStyle(R.style.PopupWindowAnimation);
popupWindow.setFocusable(false);
popupWindow.setOutsideTouchable(true);
Log.d(TAG,"startAnimation(),selectedButton:"+selectedButton+",isChecked:"+selectedButton.isChecked()+
",popupWindow.isShowing:"+popupWindow.isShowing());
if (selectedButton.isChecked()) {
if (!popupWindow.isShowing()) {
showPopup(selectPosition);
popupWindow.setOnDismissListener(this);
popupWindow.dismiss();
hideView();
if (popupWindow.isShowing()) {
popupWindow.dismiss();
hideView();
private void showPopup(int position) {
View tView = mViewArray.get(selectPosition).getChildAt(0);
if (tView instanceof ViewBaseAction) {
ViewBaseAction f = (ViewBaseAction) tV
if (popupWindow.getContentView() != mViewArray.get(position)) {
popupWindow.setContentView(mViewArray.get(position));
popupWindow.showAsDropDown(this, 0, 0);
* 如果菜单成展开状态,则让菜单收回去
public boolean onPressBack() {
Log.d(TAG,"onPressBack");
if (popupWindow != null && popupWindow.isShowing()) {
popupWindow.dismiss();
hideView();
if (selectedButton != null) {
selectedButton.setChecked(false);
private void hideView() {
Log.d(TAG, "hide()");
View tView = mViewArray.get(selectPosition).getChildAt(0);
if (tView instanceof ViewBaseAction) {
ViewBaseAction f = (ViewBaseAction) tV
private void init(Context context) {
mContext =
displayWidth = ((Activity) mContext).getWindowManager().getDefaultDisplay().getWidth();
displayHeight = ((Activity) mContext).getWindowManager().getDefaultDisplay().getHeight();
setOrientation(LinearLayout.HORIZONTAL);
public void onDismiss() {
Log.d(TAG,"onDismiss,selectPosition:"+selectPosition);
showPopup(selectPosition);
popupWindow.setOnDismissListener(null);
private OnButtonClickListener mOnButtonClickL
* 设置tabitem的点击监听事件
public void setOnButtonClickListener(OnButtonClickListener l) {
mOnButtonClickListener =
* 自定义tabitem点击回调接口
public interface OnButtonClickListener {
public void onClick(int selectPosition);
5,ViewLeft
其中的一个示例,其他两个就不列举了
package com.example.
import com.example.adapter.TextA
import com.example.expandtabview.R;
import android.content.C
import android.util.AttributeS
import android.view.LayoutI
import android.view.V
import android.widget.ListV
import android.widget.RelativeL
import android.widget.T
public class ViewLeft extends RelativeLayout implements ViewBaseAction{
private static final String TAG = "ViewLeft";
private ListView mListV
private final String[] items = new String[] { "item1", "item2", "item3", "item4", "item5", "item6" };//显示字段
private final String[] itemsVaule = new String[] { "1", "2", "3", "4", "5", "6" };//隐藏id
private OnSelectListener mOnSelectL
private TextA
private String mD
private String showText = "item1";
private Context mC
public String getShowText() {
return showT
public ViewLeft(Context context) {
super(context);
init(context);
public ViewLeft(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
public ViewLeft(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
private void init(Context context) {
mContext =
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_distance, this, true);
setBackgroundDrawable(getResources().getDrawable(R.drawable.choosearea_bg_mid));
mListView = (ListView) findViewById(R.id.listView);
adapter = new TextAdapter(context, items, R.drawable.choose_item_right, R.drawable.choose_eara_item_selector);
adapter.setTextSize(17);
if (mDistance != null) {
for (int i = 0; i < itemsVaule. i++) {
if (itemsVaule[i].equals(mDistance)) {
adapter.setSelectedPositionNoNotify(i);
showText = items[i];
mListView.setAdapter(adapter);
adapter.setOnItemClickListener(new TextAdapter.OnItemClickListener() {
public void onItemClick(View view, int position) {
if (mOnSelectListener != null) {
showText = items[position];
mOnSelectListener.getValue(itemsVaule[position], items[position]);
public void setOnSelectListener(OnSelectListener onSelectListener) {
mOnSelectListener = onSelectL
public interface OnSelectListener {
public void getValue(String distance, String showText);
public void hide() {
public void show() {
好,今天就到这里。。希望有用。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'Qt for Android | Qt 5.7
Qt for Android
Qt for Android
Qt for Android enables you to run Qt 5 applications on devices with Android v4.1 (API level 16) or later. All Qt modules (essential and add-on) are supported except Qt WebEngine, Qt Serial Port, and the platform-specific ones (Qt Mac Extras, Qt Windows Extras, and Qt X11 Extras).
The following list summarizes what you can do with Qt for Android:
applications on the device or emulator.
Support for native
with Qt Quick Controls.
content in your Qt Quick 2 applications.
readings and react to the changes.
Retrieve current position data using satellite and network information.
Connect and exchange data with
and -enabled devices.
Integrate Java code into your application using .
Develop secure applications using OpenSSL library.
Create and deploy Application Package (APK) using Qt Creator.
The following topics provide more details about how to use Qt for Android:
& 2016 The Qt Company Ltd.
Documentation contributions included herein are the copyrights of
their respective owners.
The documentation provided herein is licensed under the terms of the
as published by the Free Software Foundation.
Qt and respective logos are trademarks of The Qt Company Ltd.
in Finland and/or other countries worldwide. All other trademarks are property
of their respective owners.Icansoft 的BLOG
用户名:Icansoft
文章数:127
评论数:244
访问量:3607369
注册日期:
阅读量:5863
阅读量:12276
阅读量:329236
阅读量:1036836
51CTO推荐博文
&Android系统里面有3种类型的菜单:options menu,context menu,sub menu。
options menu&& &按Menu键就会显示,用于当前的Activity。
&& &它包括两种菜单项:
&& & & & 因为options menu在屏幕底部最多只能显示6个菜单项,这些菜单项称为icon menu,icon menu只支持文字(title) 以及icon,可以设置快捷键,不支持checkbox以及radio控件,所以不能设置checkable选项。
&& & & & 而多于6的菜单项会以&more& icon menu来调出,称为expanded menu。它不支持icon,其他的特性都和icon menu一样!
在Activity里面,一般通过以下函数来使用options menu:
&& &&Activity::onCreateOptionsMenu (Menu menu) &&创建options menu,这个函数只会在menu第一次显示时调用。
&& &&Activity::onPrepareOptionsMenu (Menu menu)& 更新改变options menu的内容,这个函数会在menu每次显示时调用。
&& &&Activity::onOptionsItemSelected (MenuItem item) 处理选中的菜单项。
context menu&& &要在相应的view上按几秒后才显示的,用于view,跟某个具体的view绑定在一起。
&& &这类型的菜单不支持icon和快捷键!
在Activity里面,一般通过以下函数来使用context menu:
&& &Activity::registerForContextMenu(View view) 为某个view注册context menu,一般在Activity::onCreate里面调用。
&& &Activity::onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 创建context menu,和options menu不同,context meun每次显示时都会调用这个函数。
&& &Activity::onContextItemSelected(MenuItem item) 处理选中的菜单项。
&& &以上两种menu都可以加入子菜单,但子菜单不能嵌套子菜单,这意味着在Android系统,菜单只有两层,设计时需要注意的!同时子菜单不支持icon。
xml形式的menu定义及应用
&& &上述的三种类型的menu都能够定义为xml资源,但需要手动地使用来得到Menu对象的引用。
&& & &一个菜单,对应一个xml文件,因为要求只能有一个根节点&menu&。官方说&?xml&声明可以不写,但我觉得还是写上好些,很多时候那个&?xml&声明主要是为了声明编码格式utf-8之类的。xml文件保存为res/menu/some_file.xml。Java代码引用资源: R.menu.some_file
&& &接下来介绍相关的节点和属性(所有的属性都定义为android空间内,例如android:icon=&@drawable/icon&):
&& &&menu& 根节点,没有属性。
&& &&group& 表示在它里面的&item&在同一group。相关属性包括:
&&&&&&&&& id:group id
&&&&&&&&& menuCategory:对应&常量Menu CATEGORY_* && 定义了一组的优先权,有
效值:container,system,secondary,和alternative
&& & & & &orderInCategory:定义这组菜单在菜单中的默认次序,int值
&& & & & &checkableBehavior:这组菜单项是否checkable。有效值:none,all(单选/单选按钮radio button),single(非单选/复选类型checkboxes)
&& & & & &visible:这组菜单是否可见 true or false
&& & & & &enabled:这组菜单是否可用,true or false
&& &&item& &菜单项,可以嵌入&menu&作为子菜单。相关属性包括:
&& & & &id: &item id
&& & & &menuCategory: 用来定义menu类别
&& & & &orderInCategory: 用来定义次序,与一个组在一起(Used to define the order of the item, within a group)
&& & & &title: 标题
&& & & &titleCondensed:标题摘要, 当原标题太长的时候,需要用简短的字符串来代替title
&& & & &icon: icon 图标
&& & & &alphabeticShortcut: 字母快捷键
&& & & &numericShortcut:数学快捷键
&& & & &checkable:是否为checkbox, true or false&
&& & & &checked:是否设置为checked状态,true or false
&& & & &visible: 是否可见, true or false
&& & & &enabled:是否可用,true or false
&version=&1.0&&encoding=&utf-8&&xmlns:android=&/apk/res/android&&&&&&android:id=&@+id/item1&&&&&&&&&&&android:title=&Item&1&&&&&&&&&&&android:icon=&@drawable/icon&&&&&&&&&&&android:checkable=&true&&&&&&&&&&&android:checked=&false&&&&&&&&&&&&&&&&&&&android:id=&@+id/group_1&&&&&&&&&&&&&android:checkableBehavior=&single&&&&&&&&&&&android:id=&@+id/group_item1&&&&&&&&&&&&&&&android:title=&Item&1&in&group&&&&&&&&&&&&&&&&&&&&&&&&android:id=&@+id/group_item2&&&&&&&&&&&&&&&&android:title=&Item&2&in&group&&&&&&&&&&&&&&&&android:checked=&true&&&&&&&&&&&&&&&&&&&&&&&&&&&&&android:id=&@+id/submenu&&&&&&&&&&&&android:title=&Sub&Menu&&&&&&&&&&&&&&&&&&&&&&&&&android:id=&@+id/submenu_item&&&&&&&&&&&&&&&&&&&&android:title=&Sub&Menu&Item&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&android:id=&@+id/item3&&&&&&&&&&&&android:title=&item&3&&&&&&&&&&&&android:checkable=&true&&&&&&&&&&&&android:checked=&true&&&&&&&&&&&&&&&
public&void&onCreate(Bundle&savedInstanceState)&{&&&&&...&&&&&registerForContextMenu(editText);&&}&&&&@Override&&public&void&onCreateContextMenu(ContextMenu&menu,&View&v,&&&&&&&&&&ContextMenuInfo&menuInfo)&{&&&&&&super.onCreateContextMenu(menu,&v,&menuInfo);&&&&&&&&getMenuInflater().inflate(R.menu.menu1,&menu);&&}&
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' border="0" alt="contextmenu" src="/attachment/444970.png" />
&& & &由于这是contextMenu,所以可以看到即使xml定义里面的item1.seticon了,但还是没有显示出来的,即那语句是无效的!
&& & 另外,要明确的是,要显示radio,需要用group,而group里面的item设置了checked = true即选中。而&checkable和checked的区别,一开始我是很困惑的,但写了代码并运行后,明白它们的区别了:&checkable=true表示这个item是checkbox,checked则表示是否选中。所以对于checkbox item,最好先写 checkable=&true&,然后再写checked。
&& &用Java来实现以上的效果图,就比较麻烦些:
private&static&final&int&MENU_GROUPITEM1&=&Menu.FIRST&+&8;&&&private&static&final&int&MENU_GROUPITEM2&=&Menu.FIRST&+&9;&&&private&static&final&int&MENU_ITEM1&=&Menu.FIRST&+&10;&&public&void&onCreate(Bundle&savedInstanceState)&{&&&&&&&&&&...&&&&&&&&&&registerForContextMenu(findViewById(R.id.edittext));&&&&}&&&&&&&&@Override&&&&public&void&onCreateContextMenu(ContextMenu&menu,&View&v,&&&&&&&&&&&&ContextMenuInfo&menuInfo)&{&&&&&&&&super.onCreateContextMenu(menu,&v,&menuInfo);&&&&&&&&&&menu.add(1,MENU_ITEM1,Menu.NONE,&&Item&1&).setCheckable(true).setChecked(false);&&&&&&&&&&&&&&&int&groupId&=&0;&&&&&&&&&&int&menuItemOrder&=&Menu.NONE;&&&&&&&&&menu.add(groupId,&MENU_GROUPITEM1,&menuItemOrder,&&Item&1&in&group&);&&&&&&&&menu.add(groupId,&MENU_GROUPITEM2,&menuItemOrder,&&Item&2&in&group&)&&&&&&&&&&&&.setChecked(true);&&&&&&&&menu.setGroupCheckable(groupId,&true,&true);&&&&&&&&&&SubMenu&subMenu&=&menu.addSubMenu(&Sub&Menu&1&);&&&&&&&&subMenu.add(&Sub&Menu&Item&)&&&&&&&&&&&&.setOnMenuItemClickListener(new&MenuItem.OnMenuItemClickListener()&{&&&&&&&&&&&&&&&&@Override&&&&&&&&&&&&&&&&public&boolean&onMenuItemClick(MenuItem&item)&{&&&&&&&&&&&&&&&&&&&&Toast.makeText(HelloDemo.this,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Sub&Menu&Item&selected&,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Toast.LENGTH_SHORT).show();&&&&&&&&&&&&&&&&&&&&return&true;&&&&&&&&&&&&&&}&&&&&&&&&&&&});&&&&&&&&&&&&menu.add(&Item&3&).setCheckable(true).setChecked(true);&&&&}&
&& &在编写过程中,发现groupId的影响很大,不推荐使用Menu.add(int titleRes)和add(CharSequence title)方法来添加MenuItem,因为没有指定groupID,默认为0,这样子和后面的menu group 一组了,导致执行完menu.setGroupCheckable(groupId,&true,&true)后同一group的Item都变成radio。
OptionsMenu的Java实现
@Override&public&boolean&onCreateOptionsMenu(Menu&menu)&{&&&&&&&&&&int&groupId&=&0;&&&&&&&&&&int&menuItemOrder&=&Menu.NONE;&&&&&&menu.add(groupId,&MENU_COPY,&menuItemOrder,&&Copy&)&&&&&&&&&.setIcon(R.drawable.icon);&&&&&menu.add(groupId,&MENU_EDIT,&menuItemOrder,&&Edit&);&&&&&menu.add(groupId,&MENU_PASTE,&menuItemOrder,&&Paste&);&&&&&menu.add(groupId,&MENU_DELETE,&menuItemOrder,&&Delete&);&&&&&menu.add(groupId,&MENU_OK,&menuItemOrder,&&Ok&);&&&&&menu.add(groupId,&MENU_CANCEL,&menuItemOrder,&&Cancel&);&&&&&menu.add(groupId,&MENU_TEST,&menuItemOrder,&&Test&);&&&&&menu.add(groupId,&MENU_DEMO,&menuItemOrder,&&Demo&);&&&&&&&&&&&&&&&&return&true;&&}&
处理菜单点击事件
&& &利用菜单自带的监听器功能,直接监听,就象处理控件事件一样,像上面的ContextMenu的subMenu.add(&Sub&Menu&Item&)设置MenuItem.OnMenuItemClickListener。
&& &在Activity和View都直接提供了一个菜单点击统一处理函数,
&& &Activity::onOptionsItemSelected (MenuItem item)&;
&&&&Activity::onContextItemSelected(MenuItem item) ;
@Override&public&boolean&onOptionsItemSelected(MenuItem&item)&{&&&&&switch(item.getItemId()){&&&&&&&&&case&MENU_COPY:&&&&&&&&&&&&&&Toast.makeText(this,&&Copy&Item&selected&,&Toast.LENGTH_SHORT).show();&&&&&&&&&&&&&break;&&&&&&&&&&default:&break;&&&&&}&&&&&return&false;&}&
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' border="0" alt="Menu" src="/attachment/013985.png" />
&& & 对于OptionsMenu,一般可以使用onPrepareOptionsMenu来改变。
&& & &另外,使用函数android.view.Menu.addIntentOptions(int groupId,int itemId,int order,ComponentName caller, Intent[] specifics, Intent intent,int flags,MenuItem[] outSpecificItems)
&& & &Specifics &以action+uri的具体方式来增加激活相应activity的菜单项
&& & &Intent & & &以categroy+uri这种一般形式来增加激活相应activity的菜单项
&& & &参数Intent和Specifics的区别是,一个用categroy+uri来匹配activity,一个用action+uri来匹配activity。
//按Action查找
Intent[] specifics = new Intent[1];
specifics[0] = new Intent(Intent.ACTION_EDIT, uri);
//按Category查找,Action设为null
Intent intent = new Intent(null, uri);
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
MenuItem[] items = new MenuItem[1];
menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0, null, specifics, intent, 0, items);
&& & 有关Menu的创建可以参考官方的。另外官方提供了Menu Design Guidelines&&
本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
13:39:29 15:14:55 22:51:34 17:22:40 16:47:28 11:29:15 16:10:44

我要回帖

更多关于 qt on android 视频 的文章

 

随机推荐