You need to use a Theme.AppCompat theme (or descendant) with this activity解决办法

来源:互联网 发布:网络课程评价的评语 编辑:程序博客网 时间:2024/06/06 09:10

因为赶项目,学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();    }}

希望有我同样遭遇的同学,看到此文也能够解决问题吧^_^

0 0
原创粉丝点击