关于android开发OptionsMenu例子及如何设置主菜单图标可见

来源:互联网 发布:规则引擎 java 编辑:程序博客网 时间:2024/04/28 16:49

//本文章绿色注解部分为设置主菜单图标可见内容,其余为菜单被点击的例子功能(增大字体,随机改变字体颜色)*********************************************************************


//这是layout布局中的代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="用于测试菜单的文本" 
        android:id="@+id/text_view"/>

</RelativeLayout>


//下面是menu布局中的代码

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item 
        android:title="修改字体大小"
        android:id="@+id/item_teacher"
        android:icon="@drawable/ud">
        <menu >
            <item android:title="增大字体"
                android:id="@+id/bigger"
                android:icon="@drawable/v4"/>
            <item android:title="减小字体"
                android:id="@+id/lower"
                android:icon="@drawable/v5"/>
        </menu>
        </item>
        <item 
            android:title="修改字体颜色"
            android:id="@+id/color"
            android:icon="@drawable/v6"/>
<item 
   android:title="修改字体样式"
   android:icon="@drawable/x3"/>
</menu>


//下面是activity中的代码,导包的部分省略

public class MainActivity extends Activity {


    private TextView textView;


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text_view);
    }
    
    //该方法会在用户点击菜单的时候调用此方法,在这个方法里给菜单设置对象
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    //首先利用activity的getMenuInflater方法获得菜单加载器
    super.getMenuInflater().inflate(R.menu.my_menulayout_item, menu);
   
    //默认情况下,主菜单下的图标不被显示出来,这里利用反射机制将菜单项图片设置为可见
    //此方法在下面有具体实现
    setMenuItemIconEnable(menu, true);
   
    return true;
    }


    
    //具体实现方法,将菜单的图标设置为可见
private void setMenuItemIconEnable(Menu menu, boolean b) {
try {
//获得可以对菜单图标设置的类的类对象,参数为类名
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
//通过反射机制可以获得MenuBuilder类中对图标设置可见的方法对象
//getDeclaredMethod方法中第一个参数是方法名,第二个参数是需要传入的参数类型且可以传入多个(查看源码可得)

Method declaredMethod = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
//因为setOptionalIconsVisible方法是私有的,所以设置私有方法可访问
declaredMethod.setAccessible(true);
//该方法第一个参数是需要设置的菜单对象,第二个参数是方法传进来的boolean值
declaredMethod.invoke(menu, b);

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
    
//该方法会在菜单选项被用户点击时回调
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.bigger) {
//bigger是布局文件中以设置好的id,即被选中增大字体选项
//因为getTextSize()方法返回的数据的单位是PX,而setTextSize()设置进去的单位是SP
//所以需要在设置数据进去之前把单位修改成PX
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textView.getTextSize()+2);
}
if(item.getItemId() == R.id.lower){
//这里需要减小字体
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textView.getTextSize()+2);
}
if (item.getItemId() == R.id.color) {
//这里需要修改字体颜色
int red = (int) (Math.random()*256);//颜色取值在0-255,math.random是0-1的随机数
int green = (int) (Math.random()*256);
int blue = (int) (Math.random()*256);
int color = Color.rgb(red, green, blue);
textView.setTextColor(color);
}
return true;
}
}

0 0