【0048】Android基础-35-Android中样式和主题-国际化-对话框
【1】style Theme
共同点:(1)定义的方式是一样的
不同点:(1)style作用范围比较窄 (控件 button textview) theme 作用在activity或者Application节点下
【1.1】定义一个样式


【1.2】定义一个主题




【1.3】【bug】
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.
【解决办法】
解决步骤如下: 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以后的样式可以由我们自己决定
【2】Android中的国际化:在公司中写代码一定要标准化,国际化是要做的工作;
下面的写中文报警告,硬编码要改为软编码,在公司中这是需要做的工作;

【1】首先要新建文件夹,注意文件夹的名称要写对,中文对应的就是value-zh(中间是中划线),
【2】然后复制一个string.xml文件,将其中的中文(或者别的语言)对应的标识改为对应国家的文字;
【3】如果新建文件的文件名可以参考IE中的命名;
【4】当设备系统中的语言设置改为对应国家的语言时,该程序对应的国际化就会生效变为对应系统设置的国家的语言;





【3】对话框
(1)普通对话框
(2)单选对话框
(3)多选对话框
(4)进度条对话框
【3.1】普通对话框


‘【出现的错误】

【错误原因】-上下文传递的不对,应该传递子类的上下文,即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 }
【3.2】单选对话框



【注】内部类要访问外部的局部的变量需要将外部的变量改为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 }
【3.3】多选对话框


【源码】
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 }
【3.4】进度条对话框
【默认样式】

【水平样式】

【源码】
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 }
【4】两种上下文的区别
补充 2种上下文的区别
this:MainActivity 子类
getApplicationContext(): 返回Context 父类
MainActivity是Context 的子类;
对话框不能用getApplicationContext();其他的地方两种上下文都是可以使用的;
一般写this来指代上下文是一定没有问题的;
原因:子类的具有的属性在父类中不具备;
【5】帧动画

【第一步】创建文件夹


【第二步】创建xml文件


【第三步】



【第四步】播放次数的设置是否为单次或者多次
true:多次播放;false:单次播放;


浙公网安备 33010602011771号