android的style属性千千万,有时想修改一些属性十分麻烦,今天就以本人在开发时遇到的一些实例来教大家怎样知道设置的style正是自己想要的效果。
第一式:alertDialog单选按钮
public class MainActivity extends Activity implements View.OnClickListener {
private CharSequence[] items = new CharSequence[]{"一二三四五", "上山打老虎", "老虎不在家", "打屁娃儿就是他"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show();
}
});
builder.setPositiveButton("消失", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="这是一个按钮"
android:textSize="16sp" />
</RelativeLayout>
这就一个普通的单选alertDialog
有时候觉得这个单选按钮好难看,要把这个按钮改成其它的,如果要做一个布局又太麻烦了。那么问题来了...怎样才能通过简单的style来修改呢》?
答案就是
<style name="dialog_style" parent="android:Theme.Holo.Light.Dialog.MinWidth"> <item name="android:listChoiceIndicatorSingle">@drawable/radio_button_button_selector</item> </style>添加listChoiceIndicatorSingle,引用其指定的drawable
还是不好看,有了一个背景边框,再加入
<item name="android:windowBackground">@android:color/transparent</item>将背景颜色做成完全透明
那么问题又来了,我为什么知道是listChoiceIndicatorSingle属性而不是button或者checkMark呢。我们跟随可爱的小mouse来一步一步定位。
进入此方法查看。捕获到这玩意
items是我们给的数据源,以经验来看,mItems和mIsSingleChoice是我们感兴趣的东西。可是我们看到这个玩意儿是红色的,进不去了,如果使用屎丢丢的话,ctrl+Shift+n可以搜索P的外部类进入查看其源码。
搜索mItems
private void createListView(final AlertController dialog) {
final RecycleListView listView = (RecycleListView)
mInflater.inflate(dialog.mListLayout, null);
ListAdapter adapter;
if (mIsMultiChoice) {
if (mCursor == null) {
adapter = new ArrayAdapter<CharSequence>(
mContext, dialog.mMultiChoiceItemLayout, R.id.text1, mItems) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if (mCheckedItems != null) {
boolean isItemChecked = mCheckedItems[position];
if (isItemChecked) {
listView.setItemChecked(position, true);
}
}
return view;
}
};
} else {
adapter = new CursorAdapter(mContext, mCursor, false) {
private final int mLabelIndex;
private final int mIsCheckedIndex;
{
final Cursor cursor = getCursor();
mLabelIndex = cursor.getColumnIndexOrThrow(mLabelColumn);
mIsCheckedIndex = cursor.getColumnIndexOrThrow(mIsCheckedColumn);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
CheckedTextView text = (CheckedTextView) view.findViewById(R.id.text1);
text.setText(cursor.getString(mLabelIndex));
listView.setItemChecked(cursor.getPosition(),
cursor.getInt(mIsCheckedIndex) == 1);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mInflater.inflate(dialog.mMultiChoiceItemLayout,
parent, false);
}
};
}
} else {
int layout = mIsSingleChoice
? dialog.mSingleChoiceItemLayout : dialog.mListItemLayout;
if (mCursor == null) {
adapter = (mAdapter != null) ? mAdapter
: new ArrayAdapter<CharSequence>(mContext, layout, R.id.text1, mItems);
} else {
adapter = new SimpleCursorAdapter(mContext, layout,
mCursor, new String[]{mLabelColumn}, new int[]{R.id.text1});
}
}
后面省略...
似乎发现了singleChoice和multiChoice,那对应的就是单选和多选,找到单选的布局
继续搜索
终于找到它的item布局,那么进去查看
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="?android:attr/textColorAlertDialogListItem"
android:gravity="center_vertical"
android:paddingStart="12dip"
android:paddingEnd="7dip"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
android:ellipsize="marquee"
/>
可以看到checkMark的引用是 ?android:attr/listChoiceIndicatorSingle,前面的?android:attr意思是如果有引用的这一串属性,就使用引用的,如果没有就使用默认的属性。
在自己的style中添加这个item就可以自定义打勾的图片。另外item的字体颜色也可以通过textColorAlertDialogListItem进行设置。
其多选的样式也大致相同,只要找到item布局,查看它对应的属性即可。
那么问题又来了,我怎么知道应该给它引用什么东西?可以再次跟随小mouse,ctrl+left查看
这下就知道该给它引用什么类型的属性了。
第二式:builder.setMessage
如果要设置message的颜色又该如何,如果直接在之前的style里面增加一项textColor是行不通的。
<style name="dialog_style" parent="android:Theme.Holo.Light.Dialog.MinWidth">
<item name="android:listChoiceIndicatorSingle">@drawable/radio_button_button_selector</item>
<item name="android:windowBackground">@android:color/transparent</item>
<del><item name="android:textColor">#f00</item></del>
</style>
首先前面都一样,即是为了找到message的所在textView,
我们ctrl+left查看一下textAppearanceMedium的注释
注释说,给"medium"文字设置文字的颜色、字体、尺寸和样式,那么应该怎样修改呢?
有一个关键字,style,可以引用style,那么问题就好解决了
<style name="dialog_style" parent="android:Theme.Holo.Light.Dialog.MinWidth">
<item name="android:listChoiceIndicatorSingle">@drawable/radio_button_button_selector</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:textAppearanceMedium">@style/test</item>
</style>
<style name="test">
<item name="android:textColor">#0f0</item>
<item name="android:textSize">20sp</item>
</style>
<pre name="code" class="java">public class MainActivity extends Activity implements View.OnClickListener {
private CharSequence[] items = new CharSequence[]{"一二三四五", "上山打老虎", "老虎不在家", "打屁娃儿就是他"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this,R.style.dialog_style);
// builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show();
// }
// });
builder.setMessage("选一个看看吧");
builder.setPositiveButton("消失", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
}
}
</pre>分别修改一下size和color<p></p><p><img src="" alt="" /><pre name="code" class="html"> <style name="dialog_style" parent="android:Theme.Holo.Light.Dialog.MinWidth">
<item name="android:listChoiceIndicatorSingle">@drawable/radio_button_button_selector</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:textAppearanceMedium">@style/test</item>
</style>
<style name="test">
<item name="android:textColor">#f0f</item>
<item name="android:textSize">30sp</item>
</style>
再查看结果
OK,下班走人。
还有那么一点点,改天继续。
万贱贱那小逗比,整天装逼,又装不过我。