1

I'm trying to style an AlertDialog to please a customer. They like the Blue title bar on Theme.Holo.Light.Dialog but like the green checkboxes from another theme. this is what I want to produce:

ここに画像の説明を入力

So, I've got a style definitions like this:

<style name="MyDialogTheme" parent="@android:Theme.Holo.Light.Dialog">
            <item name="android:listChoiceIndicatorMultiple">@drawable/checkbox_green</item>
</style> 

<style name="mycheckbox" parent="@android:style/Widget.CompoundButton.CheckBox">
    <item name="android:button">@drawable/checkbox_box</item>

</style>

and I've got a definition for checkbox_green as follows which are just PNG files:

<item android:state_checked="false" 
    android:drawable="@drawable/checkbox_unchecked" />

<item android:state_checked="true" 
    android:drawable="@drawable/checkbox_checked"/>

</selector>

and I create my dialog builder with a specific theme in Java like so:

 ContextThemeWrapper ctw = new ContextThemeWrapper( mContext, R.style.MyDialogTheme);
 AlertDialog.Builder builder= new AlertDialog.Builder( ctw );

But I cannot get the dialog to display green checkboxes instead of the blue in this theme. I get this: ここに画像の説明を入力

I could go ahead and create an entire layout and then use that like this:

 AlertDialog shareDialog  = new AlertDialog.Builder(mContext).create();
 LayoutInflater inflater = MainActivity.this.getLayoutInflater();

 View dialogView = null;
 dialogView = inflater.inflate(R.layout.share, (ViewGroup) getCurrentFocus());
 shareDialog.setView(dialogView);

but that requires styling all of the dialog, not just the checkboxes.It seems so much simpler to just re-style the checkboxes but I'm not able to make that work.

what must I do, other than to create a complete layout and use to get the green checkboxes rather than the blue?

4

3 に答える 3

2

実際には、複数選択ダイアログ内のチェックボックスを変更できます。

リストのビューにアクセスするには、ダイアログ用のカスタム アダプターが必要です。次に、setCheckMarkDrawableクラス CheckedTextView のメソッドを呼び出します。

以下に例を示します。

ここに画像の説明を入力

default_checkbox.xml内部のファイルres/drawable

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">  

    <item android:state_checked="true"
        android:drawable="@drawable/checkbox_checked" /> <!-- checked -->

    <item android:state_pressed="true"
        android:drawable="@drawable/checkbox_checked" /> <!-- pressed -->

    <item android:drawable="@drawable/checkbox_default" /> <!-- default -->

</selector>

ファイルDialogUtil.java

package example.dialog;

import android.app.AlertDialog;
import android.content.Context;
import android.util.Log;
import android.view.*;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;

public class DialogUtil {

    private DialogUtil() {
    }

    public static AlertDialog show(Context context) {
        String[] items = {"text 1", "text 2", "text 3"};
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("Test")
            .setPositiveButton("OK", null)
            .setAdapter(new CustomAdapter(context, items), null);
        AlertDialog dialog = builder.show();

        ListView list = dialog.getListView();
        list.setItemsCanFocus(false);
        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        list.setOnItemClickListener(listener);
        return dialog;
    }

    private static OnItemClickListener listener = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.i("DialogUtil", "Clicked on " + view);
        }
    };

    private static class CustomAdapter extends ArrayAdapter<String> {

        public CustomAdapter(Context context, String[] array) {
            super(context, android.R.layout.simple_list_item_multiple_choice, array);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            if (view instanceof CheckedTextView) {
                CheckedTextView checkedView = (CheckedTextView) view;
                checkedView.setCheckMarkDrawable(R.drawable.default_checkbox);
            }
            return view;
        }
    }
}

注:単に を使用する場合はAlertDialog、 を取得する前に、上記で説明したように、まずListViewを呼び出します。show

ただし、 と を使用するDialogFragmentと、が内部にonCreateDialog取得されます。ListViewonStart

于 2013-10-25T19:17:16.360 に答える
0

それは以下のようになるはずです...

最初に、互換性のある形式(jpeg、png)で必要に応じてチェックボックスを設計し、描画可能なフォルダーに配置します...

次に、ボタン用に個別のxmlを作成し、選択したチェックボックスと選択していないチェックボックス用に設計した画像を選択します...そして、このファイルを適切な名前でプロジェクトの描画可能なフォルダーに配置しますここではcustomchk.xml...

<?xml version="1.0" encoding="utf-8"?>
 <selector  xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:state_checked="false" android:drawable="@drawable/chk2" />   //custom image 
 <item android:state_checked="true" android:drawable="@drawable/chk1" />   //custom image 
 <item android:drawable="@drawable/chk2" /> <!-- default -->
</selector>

次に、checkbox:button を xml ファイルに設定します...以下のように

<CheckBox
            android:id="@+id/notifs"
            android:layout_width="150dp"
            android:button="@drawable/customchk"     //your xml
            android:layout_height="wrap_content"
/>

すべてのダイアログを変更する必要はありません...

于 2013-03-29T20:10:38.070 に答える
-1

私が知る限り、カスタム View オブジェクトを作成せずにダイアログの一部をスタイルする方法はありません。

次のようなスタイルを作成します。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AlertDialogCustom" parent="@android:style/AlertDialog">
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
        <item name="android:textSize">10sp</item>
    </style>
</resources>

次のようにビューを膨張させます。

AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogCustom));

カスタム AlertDialog スタイルで使用するチェックボックスの属性を次に示します。

于 2013-03-29T20:10:45.573 に答える