Android 右上角菜单栏

1 创建菜单栏

在res下新建menu文件夹,并且创建righttopmenu.xml

righttopmenu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/fist"
        android:title="@string/logout"
        ></item>

    <item
        android:id="@+id/second"
        android:title="@string/update"
        ></item>

</menu>

2 创建righttopmenu的activity

public class TopRightMenuActivity extends AppCompatActivity {

    public TopRightMenuActivity()
    {
        //子类添加到 AllActivitites,注销时直接调用 logout()方法
        AllActivitites.add(this);
    }

    //region 版本更新
    //Spinner
    @SuppressLint("HandlerLeak")
    Handler handler1 = new Handler() {
        @Override
        public void handleMessage(Message msg) {
//获取完版本后,执行的操作

        }
    };

    public void VersionUpdate() {

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {

                    //连接Web api 获取版本,这里省略了。
                    handler1.sendMessage(msg);
                } catch (Exception e) {


                }

            }
        }).start();
    }
    //endregion

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//指定窗体使用菜单栏
//这句话应该放在子类中,后面会提到
//setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.righttopmenu, menu);
        return true;
    }

    // 菜单的监听方法
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.fist:
//清楚登录信息
                
                                SharedPreferences setting = getSharedPreferences("setting", 0);
                                SharedPreferences.Editor editor = setting.edit();
                                editor.remove("account").commit();
                                editor.remove("pwd").commit();
//释放所有activity
                                logout();


                                Intent intent = new Intent();
                                intent.setClass(TopRightMenuActivity.this, LoginActivity.class);
                                startActivity(intent);
                            
                        });
                dialog.show();
                break;
            case R.id.second:
                VersionUpdate();
                break;

            default:
                break;
        }
        return true;

    }

//region logout后,关闭所有activity

    private static List<Activity> AllActivitites = new ArrayList<Activity>();

    //注销是销毁所有的Activity
    protected void logout() {
        for (Activity activity : AllActivitites) {
            if (activity != null) {
                activity.finish();
            }
        }
    }


    //endregion


//菜单显示图片+文字
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    if (menu != null) {
        if (menu.getClass().getSimpleName().equalsIgnoreCase("MenuBuilder")) {
            try {
                Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                method.setAccessible(true);
                method.invoke(menu, true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    return super.onMenuOpened(featureId, menu);
}

}

3 使用菜单栏

public class MainActivity extends TopRightMenuActivity

其实继承一下就好了。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
}
 

一般来说MainActivity都会setContentView的。犹豫继承了菜单栏,所以菜单栏会通过该子类activity的setContentView

默认设置了菜单栏

最后看下效果:

登录界面没有菜单栏

主界面右上角出现了菜单

点击右上角,出现了菜单按钮

PS:其中注意几点

1  login页面不需要菜单栏,所以没有继承righttopmainactivity

并且设置了NoActionBar,不现实标题栏

<activity
            android:name=".LoginActivity"
            
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

2  由于我的style.xml设置的是

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

在加入菜单后,子页面都呈现了灰色。

只要设置AndroidManifest.xml中的 theme属性就好了

<application
        
        android:theme="@style/Theme.AppCompat.Light">

    </application>


原文地址:https://www.cnblogs.com/hanjun0612/p/9779736.html