android中怎么让menu菜单显示在屏幕左上角

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android中怎么让menu菜单显示在屏幕左上角相关的知识,希望对你有一定的参考价值。

android 中让菜单menu显示在左上角,可以使用popupwindow技术,也就是悬浮菜单,设置默认的位置为左上角,如下代码:

package com.example.menutype;

import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 
 * @author tr
 * @time 2014-3-10
 * @description 自定义菜单,下拉菜单样式,添加动画效果,重写onMenuOpened()方法,自定义"menu"按键弹出菜单
 */
public class MainActivity extends Activity implements OnClickListener
  
  private static Toast mToast;
  private static Context mContext;

  private PopupWindow popupWindow ;
  
  private Button btn_popupwindow;
  
  private View mPopupWindowView;

  @Override
  protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    mContext = this;
    
    btn_popupwindow = (Button) findViewById(R.id.btn_popupwindow);
    btn_popupwindow.setOnClickListener(this);
    
    initPopupWindow();
    
  

  @Override
  public boolean onCreateOptionsMenu(Menu menu) 
    /**actionBar上更多按钮*/
    getMenuInflater().inflate(R.menu.main, menu);
    
    
    
    /**点击menu,弹出菜单*/
    
  /*
   * 
   * add()方法的四个参数,依次是:
   * 
   * 1、组别,如果不分组的话就写Menu.NONE,
   * 
   * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单
   * 
   * 3、顺序,那个菜单现在在前面由这个参数的大小决定
   * 
   * 4、文本,菜单的显示文本
   */

  menu.add(Menu.NONE, Menu.FIRST + 1, 1, getResource(R.string.edit_text)).setIcon(

  R.drawable.ic_edit);

  // setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以

  // android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的

  menu.add(Menu.NONE, Menu.FIRST + 2, 2, getResource(R.string.file)).setIcon(

  R.drawable.ic_menu_file);

  menu.add(Menu.NONE, Menu.FIRST + 3, 3, getResource(R.string.about)).setIcon(

  R.drawable.ic_menu_about);

    return true;
  
  
  
  /**菜单打开时调用*/
  @Override
  public boolean onMenuOpened(int featureId, Menu menu) 
    // TODO Auto-generated method stub
    showToast("menu菜单打开:"+featureId);
    //点击"menu"按钮打开
    if(featureId == 0)
      showPopupWindow();
    
    return super.onMenuOpened(featureId, menu);// 返回为true 则显示系统menu
// return false;
  

  /**menu菜单关闭时调用*/
  @Override
  public void onOptionsMenuClosed(Menu menu) 
    // TODO Auto-generated method stub
    super.onOptionsMenuClosed(menu);
    
    showToast("menu菜单关闭");
  

  @Override
  public boolean onOptionsItemSelected(MenuItem item) 
    // TODO Auto-generated method stub
    switch(item.getItemId())
    case Menu.FIRST + 1:
    case R.id.action_edit:
      showToast(getResource(R.string.edit_text));
      break;
    case Menu.FIRST + 2:
    case R.id.action_file:
      showToast(getResource(R.string.file));
      break;
    case R.id.action_favorite:
      showToast(getResource(R.string.favorite));
      break;
    case R.id.action_share:
      showToast(getResource(R.string.share));
      break;
    case Menu.FIRST + 3:
    case R.id.action_about:
      showToast(getResource(R.string.about));
      break;
    
    return super.onOptionsItemSelected(item);
  

  @Override
  public void onClick(View v) 
    
    switch(v.getId())
    case R.id.btn_popupwindow:

      showPopupWindow();
      break;
    case R.id.textview_about:
      showToast(getResource(R.string.about));
      popupWindow.dismiss();
      break;
    case R.id.textview_edit:
      showToast(getResource(R.string.edit_text));
      popupWindow.dismiss();
      break;
    case R.id.textview_file:
      showToast(getResource(R.string.file));
      popupWindow.dismiss();
      break;
    
  
  
  /**显示popupwindow*/
  private void showPopupWindow()

    if(!popupWindow.isShowing())
      popupWindow.showAsDropDown(btn_popupwindow, btn_popupwindow.getLayoutParams().width/2, 0);
    else
      popupWindow.dismiss();
    
  
  
  
  /**
   * 初始化popupwindow
   */
  private void initPopupWindow()
    initPopupWindowView();
    //初始化popupwindow,绑定显示view,设置该view的宽度/高度
    popupWindow = new PopupWindow(mPopupWindowView,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
    popupWindow.setFocusable(true);
    popupWindow.setOutsideTouchable(true);
    // 这个是为了点击“返回Back”也能使其消失,并且并不会影响你的背景;使用该方法点击窗体之外,才可关闭窗体
    popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bitmap_book_read_chapterlist_repeat));
    //Background不能设置为null,dismiss会失效
// popupWindow.setBackgroundDrawable(null);
    //设置渐入、渐出动画效果
// popupWindow.setAnimationStyle(R.style.popupwindow);
    popupWindow.update();
    //popupWindow调用dismiss时触发,设置了setOutsideTouchable(true),点击view之外/按键back的地方也会触发
    popupWindow.setOnDismissListener(new OnDismissListener() 
      
      @Override
      public void onDismiss() 
        // TODO Auto-generated method stub
// showToast("关闭popupwindow");
      
    );
  
参考技术A   用惯了Android的人在刚拿到iPhone的时候,总是会习惯性的用手指从状态栏往下拖一下,这都是给Notification闹的。
不过Notification也确实是1个不错的提示工具,不干扰正常的操作,事后还可以再翻看详细的内容,点击后还可以进入相关的画面查看更具体的内容。
今天我就以代码为主的形式来介绍Notification的使用,包括基本用法,自定义的View,以及更多的控制方法。
另一种Android中常用到的提示方法Toast的用法请参见《教程:在Android中使用Toast进行提示》
我们先看下Notification的几个主要组成部分:
Icon:不解释
Ticker Text:Notification刚出来的时候,在状态栏上滚动的字幕,如果很长,会自动分割滚动

Content Title:Notification展开后的标题
Content Text:Notification展开后的内容

Notification的一般用法
取得NotificationManager
  private NotificationManager mNotificationManager;
mNotificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
创建Notification并且显示
  //Notification的滚动提示
String tickerText = "My notification, It's a long text! Hello World desiyo?";
//Notification的图标,一般不要用彩色的
int icon = R.drawable.icon_02241_3;

//contentTitle和contentText都是标准的Notification View的内容
//Notification的内容标题,拖下来后看到的标题
String contentTitle="My notification";
//Notification的内容
String contentText="Hello World!";

//Notification的Intent,即点击后转向的Activity
Intent notificationIntent = new Intent(this, this.getClass());
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);

//创建Notifcation
Notification notification = new Notification(icon, tickerText, System.currentTimeMillis());
//设定Notification出现时的声音,一般不建议自定义
notification.defaults |= Notification.DEFAULT_SOUND;
//设定如何振动
notification.defaults |= Notification.DEFAULT_VIBRATE;
//指定Flag,Notification.FLAG_AUTO_CANCEL意指点击这个Notification后,立刻取消自身
//这符合一般的Notification的运作规范
notification.flags|=Notification.FLAG_AUTO_CANCEL;
notification.setLatestEventInfo(this, contentTitle, contentText, contentIntent);
//显示这个notification
mNotificationManager.notify(HELLO_ID, notification);
这是最基本的应用,可以说除了找个合适的图标以外,其它都很简单。

使用自定义View的Notification
同Toast一样,我们也可以自已指定1个View来作为Notification展开后的显示内容,比如说在Android Market中下载的时候,Notification中会显示当前下载的进度,那么我们也来模拟1个这样的效果吧。
首先给出View的定义文件:notification_view_sample.xml
  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="3dp"
>
<ImageView android:id="@+id/notificationImage"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:src="@android:drawable/stat_sys_download"
/>
<TextView android:id="@+id/notificationTitle"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_toRightOf="@id/notificationImage"
android:layout_alignParentRight="true"
android:paddingLeft="6dp"
android:textColor="#FF000000"
/>
<TextView android:id="@+id/notificationPercent"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/notificationImage"
android:paddingTop="2dp"
android:textColor="#FF000000"
/>
<ProgressBar android:id="@+id/notificationProgress"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/notificationTitle"
android:layout_alignLeft="@id/notificationTitle"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/notificationPercent"
android:paddingLeft="6dp"
android:paddingRight="3dp"
android:paddingTop="2dp"
style="?android:attr/progressBarStyleHorizontal"
/>
</RelativeLayout>
RelativeLayout的使用,可以参考:《教程:Android各种Layout特性和使用汇总(一)》本回答被提问者和网友采纳

以上是关于android中怎么让menu菜单显示在屏幕左上角的主要内容,如果未能解决你的问题,请参考以下文章

Android之在活动中使用Menu

android 怎么把menu按钮事情显示出来的菜单替换成另一个Activity

Android之三种Menu的使用

Android之三种Menu的使用

让所有最小化的窗口都显示在屏幕上的快捷键是啥?

qmenu设置字体颜色