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>