android一些你知道的或不知道的style

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,下班走人。

还有那么一点点,改天继续。

万贱贱那小逗比,整天装逼,又装不过我。


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值