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:單次播放;