10-31 00:59:44.550: E/AndroidRuntime(3994): Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
【解决办法】php
解决步骤以下: 1、res/styles.xml文件中从新添加一个style样式AppTheme.Base,而后将AppTheme继承自AppTheme.Base,代码以下: [html] view plain copy <resources> <!-- Base application theme. --> <style name="AppTheme" parent="AppTheme.Base"> <!-- Customize your theme here. --> </style> <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:windowBackground">@android:color/white</item> </style> </resources> 2、在res文件中建立values-v21文件夹,而后在此文件夹下建立styles.xml文件,代码以下: [html] view plain copy <?xml version="1.0" encoding="utf-8"?> <resources> <style name="AppTheme" parent="AppTheme.Base"> <item name="android:colorPrimary">@color/colorPrimary</item> <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item> <item name="android:colorAccent">@color/colorAccent</item> </style> </resources> 说明:values-v21文件夹中的内容是专门针对API21以上的版本所使用的配置文件,也就是说若是是API21以前的文件就是使用res/values中的styles.xml,不然使用values-v21文件夹下的styles.xml 经过以上两步,就能够轻松实现MainActivity仍是继承自AppCompatActivity,也就是说能够将Material Design的效果运行在API21以前版本的手机上,而且API21以前的样式和API21之后的样式能够由咱们本身决定
下面的写中文报警告,硬编码要改成软编码,在公司中这是须要作的工做;html
【1】首先要新建文件夹,注意文件夹的名称要写对,中文对应的就是value-zh(中间是中划线),java
【2】而后复制一个string.xml文件,将其中的中文(或者别的语言)对应的标识改成对应国家的文字;android
【3】若是新建文件的文件名能够参考IE中的命名;ios
【4】当设备系统中的语言设置改成对应国家的语言时,该程序对应的国际化就会生效变为对应系统设置的国家的语言;网络
(1)普通对话框app
(2)单选对话框ide
(3)多选对话框动画
(4)进度条对话框ui
‘【出现的错误】
【错误缘由】-上下文传递的不对,应该传递子类的上下文,即this;
【源码】
1 // 点击按钮 弹出一个普通对话框 2 public void click1(View v) { 3 4 // 构建AlertDialog 5 AlertDialog.Builder builder = new Builder(this); 6 builder.setTitle("警告"); 7 builder.setMessage("世界上最遥远的距离是没有网络"); 8 builder.setPositiveButton("肯定", new OnClickListener() { 9 10 @Override 11 public void onClick(DialogInterface dialog, int which) { 12 13 System.out.println("点击了肯定按钮 执行的逻辑"); 14 15 } 16 }); 17 builder.setNegativeButton("取消", new OnClickListener() { 18 19 @Override 20 public void onClick(DialogInterface dialog, int which) { 21 22 System.out.println("点击了取消按钮"); 23 } 24 }); 25 // 最后一步必定要记得 show出来 26 builder.show(); 27 28 }
【注】内部类要访问外部的局部的变量须要将外部的变量改成final;
【源码】
1 // 点击按钮 弹出一个单选对话框 2 public void click2(View v) { 3 4 // 构建AlertDialog 5 AlertDialog.Builder builder = new Builder(this); 6 builder.setTitle("请选择您喜欢的课"); 7 final String items[] = { "Android", "ios", "php", "c", "C++", "html" }; 8 builder.setSingleChoiceItems(items, -1, new OnClickListener() { 9 10 @Override 11 public void onClick(DialogInterface dialog, int which) { 12 13 // 取出点中的条目 14 String item = items[which]; 15 Toast.makeText(getApplicationContext(), item, 1).show(); 16 // 关闭当前对话框 17 dialog.dismiss(); 18 } 19 }); 20 21 // 最后一步必定要记得 show出来 22 builder.show(); 23 24 }
【源码】
1 // 点击按钮 弹出一个多选对话框 2 public void click3(View v) { 3 // 构建AlertDialog 4 AlertDialog.Builder builder = new Builder(this); 5 builder.setTitle("请选择您喜欢吃的水果"); 6 final String items[] = { "榴莲", "苹果", "葡萄", "香蕉", "黄瓜", "火龙果", "荔枝" }; 7 final boolean[] checkedItems = { true, false, false, false, false, 8 false, true }; 9 builder.setMultiChoiceItems(items, checkedItems, 10 new OnMultiChoiceClickListener() { 11 12 @Override 13 public void onClick(DialogInterface dialog, int which, 14 boolean isChecked) { 15 16 } 17 }); 18 builder.setPositiveButton("肯定", new OnClickListener() { 19 20 @Override 21 public void onClick(DialogInterface dialog, int which) { 22 23 StringBuffer sb = new StringBuffer(); 24 // [1]把你选中的水果给取出来 25 for (int i = 0; i < checkedItems.length; i++) { 26 if (checkedItems[i]) { 27 // 就证实是选中的 28 String fruit = items[i]; 29 sb.append(fruit + " "); 30 31 } 32 33 } 34 35 Toast.makeText(getApplicationContext(), sb.toString(), 1) 36 .show(); 37 // 关闭对话框 38 dialog.dismiss(); 39 40 } 41 }); 42 43 // 最后一步必定要记得 show出来 44 builder.show(); 45 46 }
【默认样式】
【水平样式】
【源码】
1 //进度条对话框 2 public void click4(View v) { 3 4 //与进度相关的控件均可以直接在子线程更新ui 5 final ProgressDialog dialog = new ProgressDialog(this); 6 dialog.setTitle("正在玩命加载ing"); 7 dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 8 dialog.show(); 9 //设置进度条的最大值 10 dialog.setMax(100); 11 new Thread(){public void run() { 12 for (int i = 0; i <= 100; i++) { 13 //设置当前的进度 14 15 SystemClock.sleep(50);//睡眠50毫秒 16 dialog.setProgress(i); 17 } 18 //关闭对话框 19 dialog.dismiss(); 20 21 22 };}.start(); 23 24 25 } 26 27 }
补充 2种上下文的区别
this:MainActivity 子类
getApplicationContext(): 返回Context 父类
MainActivity是Context 的子类;
对话框不能用getApplicationContext();其余的地方两种上下文都是可使用的;
通常写this来指代上下文是必定没有问题的;
缘由:子类的具备的属性在父类中不具有;
【第一步】建立文件夹
【第二步】建立xml文件
【第三步】
【第四步】播放次数的设置是否为单次或者屡次
true:屡次播放;false:单次播放;