因为赶项目,学android半个多月,就开始动工了,开发工具为Android Studio,布局用了DrawableLayout+NavagationView;
因为有多个Activity都是相同的布局,所以把共用方法提取到一个类中,一切都正常,直到做点Navagation的退出按钮时,问题来了:
public static void dialog_Exit(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("确定要退出吗?");
builder.setTitle("提示");
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setPositiveButton("确认",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
android.os.Process.killProcess(android.os.Process
.myPid());
}
});
builder.setNegativeButton("取消",
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
上面的是弹出一个提示框,让用户确认操作。
在NavagationView的onNavigationItemSelected事件中,调用上面的方法是这样子调的:
dialog_Exit(getApplicatioinContext());
语法上没错,编译通过,但是在虚拟设备中运行时,被提示:
You need to use a Theme.AppCompat theme (or descendant) with this activity
从字面意思理解,是说我要用AppCompat 的主题,参照了网上的建议:
http://www.xuebuyuan.com/2233181.html
http://blog.csdn.net/zxm317122667/article/details/50984644
这上面的做法,解决了他们的问题,但是在我这里,问题依旧,没办法,不认识什么android高手,只能继续百度,在我快要放弃的时候,突然发现有老外碰到过这情况,
http://stackoverflow.com/questions/30180052/you-need-to-use-a-theme-appcompat-theme-or-descendant-with-this-activity-chan
里面的朋友说:DO NOT use application context for inflating views, creating dialogs,要用new AlertDialog.Builder(this),would be fine as well because it reads alertDialogTheme attribute,难道是这个原因?抱着试一试的心情,把getApplicationContext()换成Activity.this.居然真有效,提取的基类完整代码如下:
package cn.com.zifar.mobileforpatrol;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import cn.com.zifar.Models.BaseUserInfoModel;
import cn.com.zifar.enums.UserInfoFilds;
/**
* Created by weige on 2016/12/26.
*/
public class MyBaseActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{
protected NavigationView navigationView;
protected TextView userNameText;
protected TextView textView;
protected String userNo,userName,bmName;
protected int bmId;
protected long LoginTime;
protected LayoutInflater inflater;
protected View contentView;
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
protected void InitUserInfo(BaseUserInfoModel um){
if(userNameText!=null)userNameText.setText(um.getUserName()+"["+um.getUserNo()+"]");
if(textView!=null)textView.setText(um.getBmName());
userName=um.getUserName();
userNo=um.getUserNo();
bmId=um.getBmid();
bmName=um.getBmName();
LoginTime=um.getLoginTime();
}
protected void InitTools(){
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
protected void InitMyActivity(){
//判断登录
Intent intent=getIntent();
userNo=intent.getStringExtra(UserInfoFilds.UserNo.GetText());
if(userNo==null || userNo.equals("")){
Intent loginIntent=new Intent();
loginIntent.setClass(getApplicationContext(),LoginActivity.class);
startActivity(loginIntent);
this.finish();
return;
}
userName=intent.getStringExtra(UserInfoFilds.UserName.GetText());
bmName=intent.getStringExtra(UserInfoFilds.BmName.GetText());
bmId=intent.getIntExtra(UserInfoFilds.BmId.GetText(),0);
LoginTime=intent.getLongExtra(UserInfoFilds.LoginTime.GetText(),0);
inflater=getLayoutInflater();
navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setItemIconTintList(null);
View headerView=navigationView.getHeaderView(0);
navigationView.setNavigationItemSelectedListener(this);
userNameText=(TextView)headerView.findViewById(R.id.userNameText);
textView=(TextView)headerView.findViewById(R.id.textView);
if(userNameText!=null)userNameText.setText(userName+"["+userNo+"]");
if(textView!=null)textView.setText(bmName);
contentView=findViewById(R.id.contentPanel);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
Intent intent=new Intent();
intent.putExtra(UserInfoFilds.UserNo.GetText(),userNo);
intent.putExtra(UserInfoFilds.UserName.GetText(),userName);
intent.putExtra(UserInfoFilds.BmName.GetText(),bmName);
intent.putExtra(UserInfoFilds.BmId.GetText(),bmId);
intent.putExtra(UserInfoFilds.LoginTime.GetText(),LoginTime);
switch (id){
case R.id.nav_personInfo://个人信息
{
intent.setClass(getApplicationContext(),PersonInfoActivity.class);
startActivity(intent);
break;
}
case R.id.patrolChangeUser://切换用户
{
intent.setClass(getApplicationContext(),PatrolChangeActivity.class);
startActivity(intent);
break;
}
case R.id.patrolDown://更新数据
{
intent.setClass(getApplicationContext(),PatrolDownActivity.class);
startActivity(intent);
break;
}
case R.id.patrolLogout://退出系统
{
dialog_Exit(MyBaseActivity.this);
break;
}
case R.id.patrolMap://加载巡检地图
{
intent.setClass(getApplicationContext(),PatrolMapctivity.class);
startActivity(intent);
break;
}
case R.id.patrolSetting://系统设置
{
intent.setClass(getApplicationContext(),PatrolSettingctivity.class);
startActivity(intent);
break;
}
case R.id.patrolTask://任务下载
{
intent.setClass(getApplicationContext(),PatrolDownActivity.class);
startActivity(intent);
break;
}
case R.id.patrolUpData://数据上传
{
intent.setClass(getApplicationContext(),UpDataActivity.class);
startActivity(intent);
break;
}
}
item.setCheckable(true);
item.setChecked(true);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
public static void dialog_Exit(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("确定要退出吗?");
builder.setTitle("提示");
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setPositiveButton("确认",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
android.os.Process.killProcess(android.os.Process
.myPid());
}
});
builder.setNegativeButton("取消",
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
}
希望有我同样遭遇的同学,看到此文也能够解决问题吧^_^