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

因为赶项目,学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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值