利用android-styled-dialogs-master 设置dialog
网址: https://github.com/avast/android-styled-dialogs
如何使用该库来创建自己的对话框,注意点有以下几点:
1.自己的项目必须依赖android-styled-dialogs-lib项目,仅仅导入lib项目生成的jar包是会运行报错的。
2.如果要修改theme,则须拷贝demo项目中的color.xml和theme.xml到本项目中的res/values目录下
其他就可以参考demo项目了。创建对话框非常简单,若要响应对话框则须继承ISimpleDialogListener接口和ISimpleDialogCancelListener接口并实现响应的方法,注意给每个对话框一个requestCode,这样在方法中就可以区分点击是来自哪个对话框。
下载工程运行demo:
/*
* Copyright 2013 Inmite s.r.o. (www.inmite.eu).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.avast.dialogs;
import java.text.DateFormat;
import java.util.Date;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.content.res.TypedArray;
import android.util.TypedValue;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Toast;
import com.avast.android.dialogs.fragment.DatePickerDialogFragment;
import com.avast.android.dialogs.fragment.ListDialogFragment;
import com.avast.android.dialogs.fragment.ProgressDialogFragment;
import com.avast.android.dialogs.fragment.SimpleDialogFragment;
import com.avast.android.dialogs.fragment.TimePickerDialogFragment;
import com.avast.android.dialogs.iface.IDateDialogListener;
import com.avast.android.dialogs.iface.IListDialogListener;
import com.avast.android.dialogs.iface.IMultiChoiceListDialogListener;
import com.avast.android.dialogs.iface.ISimpleDialogCancelListener;
import com.avast.android.dialogs.iface.ISimpleDialogListener;
public class DemoActivity extends ActionBarActivity implements
ISimpleDialogListener,
IDateDialogListener,
ISimpleDialogCancelListener,
IListDialogListener,
IMultiChoiceListDialogListener {
private static final int REQUEST_PROGRESS = 1; //自定义用来区分不同Dialog标识符,使用方法看代码
private static final int REQUEST_LIST_SIMPLE = 9;
private static final int REQUEST_LIST_MULTIPLE = 10;
private static final int REQUEST_LIST_SINGLE = 11;
private static final int REQUEST_DATE_PICKER = 12;
private static final int REQUEST_TIME_PICKER = 13;
private static final int REQUEST_SIMPLE_DIALOG = 42;
DemoActivity c = this;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setIcon(R.drawable.img_avast_logo_small);
//第一个Dialog
findViewById(R.id.message_dialog).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SimpleDialogFragment.createBuilder(c, getSupportFragmentManager())
.setMessage("Love. Can know all the math in the \'verse but take a boat in the air that you don\'t " +
"love? She\'ll shake you off just as sure as a turn in the worlds. Love keeps her in the air when " +
"she oughtta fall down...tell you she\'s hurtin\' \'fore she keens...makes her a home.").show();
}
});
findViewById(R.id.message_title_dialog).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SimpleDialogFragment.createBuilder(c, getSupportFragmentManager())
.setTitle("More Firefly quotes:").setMessage
("Wash: \"Psychic, though? That sounds like something out of science fiction.\"\n\nZoe: \"We live" +
" " +
"in a space ship, dear.\"\nWash: \"Here lies my beloved Zoe, " +
("my autumn flower ... somewhat less attractive now that she's all corpsified and gross" +
".\"\n\nRiver Tam: \"Also? I can kill you with my brain.\"\n\nKayle: \"Going on a year now, nothins twixed my neathers not run on batteries.\" \n" +
"Mal: \"I can't know that.\" \n" +
"Jayne: \"I can stand to hear a little more.\"\n\nWash: \"I've been under fire before. " +
"Well ... I've been in a fire. Actually, I was fired. I can handle myself.\""))
.setNegativeButtonText("Close")
.show();
}
});
findViewById(R.id.message_title_buttons_dialog)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SimpleDialogFragment.createBuilder(c, getSupportFragmentManager())
.setTitle("Do you like this quote?")
.setMessage("Jayne: \"Shiny. Let's be bad guys.\"")
.setPositiveButtonText("Love")
.setNegativeButtonText("Hate")
.setNeutralButtonText("WTF?")
.setRequestCode(REQUEST_SIMPLE_DIALOG)
.show();
}
});
findViewById(R.id.long_buttons).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SimpleDialogFragment.createBuilder(c, getSupportFragmentManager()).setMessage("How will you decide?")
.setPositiveButtonText("Time for some thrillin' heroics!").setNegativeButtonText("Misbehave")
.setNeutralButtonText("Keep flying").show();
}
});
//显示一个进度条
findViewById(R.id.progress_dialog).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProgressDialogFragment.createBuilder(c, getSupportFragmentManager())
.setMessage("Mal: I\'m just waiting to see if I pass out. Long story.")
.setRequestCode(REQUEST_PROGRESS)
.show();
}
});
findViewById(R.id.list_dialog_simple).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ListDialogFragment
.createBuilder(c, getSupportFragmentManager())
.setTitle("Your favorite character:")
.setItems(new String[]{"Jayne", "Malcolm", "Kaylee",
"Wash", "Zoe", "River"})
.setRequestCode(REQUEST_LIST_SIMPLE)
.show();
}
});
findViewById(R.id.list_dialog_single).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ListDialogFragment
.createBuilder(c, getSupportFragmentManager())
.setTitle("Your favorite character:")
.setItems(new String[]{"Jayne", "Malcolm", "Kaylee",
"Wash", "Zoe", "River"})
.setRequestCode(REQUEST_LIST_SINGLE)
.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE)
.show();
}
});
//包含多个选项的一个Dialog
findViewById(R.id.list_dialog_multiple).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ListDialogFragment
.createBuilder(c, getSupportFragmentManager())
.setTitle("Your favorite character:")
.setItems(new String[]{"Jayne", "Malcolm", "Kaylee",
"Wash", "Zoe", "River"})//包含的选项
.setRequestCode(REQUEST_LIST_MULTIPLE) //如果有多个CHOICE_MODE_MULTIPLE类型的Dialog,用这个标志区分。
.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE)//指明这是个可多个选择的Dialog。
.setCheckedItems(new int[]{1, 3})
.show();
}
});
findViewById(R.id.custom_dialog).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
JayneHatDialogFragment.show(c);
}
});
findViewById(R.id.time_picker).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TimePickerDialogFragment
.createBuilder(DemoActivity.this, getSupportFragmentManager())
.setDate(new Date())
.setPositiveButtonText(android.R.string.ok)
.setNegativeButtonText(android.R.string.cancel)
.setRequestCode(REQUEST_TIME_PICKER)
.show();
}
});
findViewById(R.id.date_picker).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DatePickerDialogFragment
.createBuilder(DemoActivity.this, getSupportFragmentManager())
.setDate(new Date())
.setPositiveButtonText(android.R.string.ok)
.setNegativeButtonText(android.R.string.cancel)
.setRequestCode(REQUEST_DATE_PICKER)
.show();
}
});
}
// IListDialogListener
@Override
public void onListItemSelected(CharSequence value, int number, int requestCode) {
if (requestCode == REQUEST_LIST_SIMPLE || requestCode == REQUEST_LIST_SINGLE) {
Toast.makeText(c, "Selected: " + value, Toast.LENGTH_SHORT).show();
}
}
@Override //此类方法用来响应CHOICE_MODE_MULTIPLE类型的Dialog选择后的操作,其中REQUEST_LIST_MULTIPLE指明哪个Dialog。传参values为选择的选项。
public void onListItemsSelected(CharSequence[] values, int[] selectedPositions, int requestCode) {
if (requestCode == REQUEST_LIST_MULTIPLE) {
StringBuilder sb = new StringBuilder();
for (CharSequence value : values) {
if (sb.length() > 0) {
sb.append(", ");
}
sb.append(value);
}
Toast.makeText(c, "Selected: " + sb.toString(), Toast.LENGTH_SHORT).show();
}
}
// ISimpleDialogCancelListener
@Override //Dialog的 cancel操作:
public void onCancelled(int requestCode) {
switch (requestCode) {
case REQUEST_SIMPLE_DIALOG:
Toast.makeText(c, "Dialog cancelled", Toast.LENGTH_SHORT).show();
break;
case REQUEST_PROGRESS:
Toast.makeText(c, "Progress dialog cancelled", Toast.LENGTH_SHORT).show();
break;
case REQUEST_LIST_SIMPLE:
case REQUEST_LIST_SINGLE:
case REQUEST_LIST_MULTIPLE:
Toast.makeText(c, "Nothing selected", Toast.LENGTH_SHORT).show();
break;
case REQUEST_DATE_PICKER:
Toast.makeText(c, "Date picker cancelled", Toast.LENGTH_SHORT).show();
break;
case REQUEST_TIME_PICKER:
Toast.makeText(c, "Time picker cancelled", Toast.LENGTH_SHORT).show();
break;
}
}
// ISimpleDialogListener 选择对话框操作。
@Override
public void onPositiveButtonClicked(int requestCode) {
if (requestCode == REQUEST_SIMPLE_DIALOG) {
Toast.makeText(c, "Positive button clicked", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onNegativeButtonClicked(int requestCode) {
if (requestCode == REQUEST_SIMPLE_DIALOG) {
Toast.makeText(c, "Negative button clicked", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onNeutralButtonClicked(int requestCode) {
if (requestCode == REQUEST_SIMPLE_DIALOG) {
Toast.makeText(c, "Neutral button clicked", Toast.LENGTH_SHORT).show();
}
}
// IDateDialogListener
@Override
public void onNegativeButtonClicked(int resultCode, Date date) {
String text = "";
if (resultCode == REQUEST_DATE_PICKER) { //yes or cancel -> cancel
text = "Date ";
} else if (resultCode == REQUEST_TIME_PICKER) { //no
text = "Time ";
}
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT);
Toast.makeText(this, text + "Cancelled " + dateFormat.format(date), Toast.LENGTH_SHORT).show();
}
@Override
public void onPositiveButtonClicked(int resultCode, Date date) {
String text = "";
if (resultCode == REQUEST_DATE_PICKER) { //yes or cancel -> yes
text = "Date ";
} else if (resultCode == REQUEST_TIME_PICKER) { //now time
text = "Time ";
}
DateFormat dateFormat = DateFormat.getDateTimeInstance();
Toast.makeText(this, text + "Success! " + dateFormat.format(date), Toast.LENGTH_SHORT).show();
}
// menu
@Override
public boolean onCreateOptionsMenu(Menu menu) { //创建Options菜单栏内容
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu); //main.xml
if (isDarkTheme()) {
menu.findItem(R.id.theme_change).setTitle("Use Light Theme");//亮
}
else {
menu.findItem(R.id.theme_change).setTitle("Use Dark Theme");//点开Dialog后,背景为暗
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {//响应菜单栏操作
switch (item.getItemId()) {
case R.id.theme_change: //如果点击了这个控件:
if (isDarkTheme()) {
setTheme(R.style.AppTheme);
Toast.makeText(DemoActivity.this, "Light theme set", Toast.LENGTH_SHORT).show();
} else {
setTheme(R.style.AppThemeDark);//setTheme:API函数 , R.style.AppThemeDark:type.xml中定义的。
Toast.makeText(DemoActivity.this, "Dark theme set", Toast.LENGTH_SHORT).show();
}
supportInvalidateOptionsMenu();
return true;
case R.id.about:
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("https://github.com/avast/android-styled-dialogs"));
startActivity(i);
return true;
}
return super.onOptionsItemSelected(item);
}
private boolean isDarkTheme() {
boolean darkTheme = false;
//Try-catch block is used to overcome resource not found exception
try {
TypedValue val = new TypedValue();
//Reading attr value from current theme
getTheme().resolveAttribute(com.avast.android.dialogs.R.attr.isLightTheme, val, true);
//Passing the resource ID to TypedArray to get the attribute value
TypedArray arr = obtainStyledAttributes(val.data, new int[]{com.avast.android.dialogs.R.attr.isLightTheme});
darkTheme = !arr.getBoolean(0, false);
arr.recycle();
} catch (RuntimeException e) {
//Resource not found , so sticking to light theme
darkTheme = false;
}
return darkTheme;
}
}