1

タイムピッカーの設定などのカスタム設定の場合、Androidでは次のXMLを使用します。

<com.my.package.TimePreference android:key="notification_time" android:selectable="true" android:title="@string/notification_time" android:enabled="true" android:summary="@string/setTime" android:defaultValue="00:00" />

クラス「TimePreference」は次のとおりです。

package com.my.package;

import android.content.Context;
import android.content.res.TypedArray;
import android.preference.DialogPreference;
import android.text.format.DateFormat;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TimePicker;

public class TimePreference extends DialogPreference {

    private int lastHour = 0;
    private int lastMinute = 0;
    private TimePicker picker = null;
    private boolean is_24_hours = true;

    public static int getHour(String time) {
        String[] pieces = time.split(":");
        return(Integer.parseInt(pieces[0]));
    }

    public static int getMinute(String time) {
        String[] pieces = time.split(":");
        return(Integer.parseInt(pieces[1]));
    }

    public TimePreference(Context ctxt) {
        this(ctxt, null);
    }

    public TimePreference(Context ctxt, AttributeSet attrs) {
        this(ctxt, attrs, 0);
    }

    public TimePreference(Context ctxt, AttributeSet attrs, int defStyle) {
        super(ctxt, attrs, defStyle);
        setPositiveButtonText(ctxt.getString(R.string.save));
        setNegativeButtonText(ctxt.getString(R.string.cancel));
        try {
            is_24_hours = DateFormat.is24HourFormat(ctxt);
        }
        catch (Exception e) {
            is_24_hours = true;
        }
    }

    @Override
    protected View onCreateDialogView() {
        picker = new TimePicker(getContext());
        if (is_24_hours) {
            picker.setIs24HourView(true);
        }
        else {
            picker.setIs24HourView(false);
        }
        return(picker);
    }

    @Override
    protected void onBindDialogView(View v) {
        super.onBindDialogView(v);
        picker.setCurrentHour(lastHour);
        picker.setCurrentMinute(lastMinute);
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);
        if (positiveResult) {
            picker.clearFocus(); // important - otherwise manual input is not saved
            lastHour = picker.getCurrentHour();
            lastMinute = picker.getCurrentMinute();
            String time = String.valueOf(lastHour)+":"+String.valueOf(lastMinute);
            if (callChangeListener(time)) {
                persistString(time);
            }
        }
    }

    @Override
    protected Object onGetDefaultValue(TypedArray a, int index) {
        return(a.getString(index));
    }

    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        String time = null;
        if (restoreValue) {
            if (defaultValue == null) {
                time = getPersistedString("00:00");
            }
            else {
                time = getPersistedString(defaultValue.toString());
            }
        }
        else {
            time = defaultValue.toString();
        }
        lastHour = getHour(time);
        lastMinute = getMinute(time);
    }
}

これはAndroid2.2および2.3で常にうまく機能していましたが、Android 4.0に切り替えたので、この設定が設定画面のレイアウトに調整されていないことがわかります。

ここに画像の説明を入力してください

どうすればこの問題を解決できますか?マージン/パディングを手動で設定するよりも優れた解決策はありますか?

4

1 に答える 1

4

最後に問題を発見しました:

2つの引数のみをとる(引数をとらない)コンストラクターsuper()を呼び出す必要がありますint defStyle

質問のコードでは、は事前定義された値whcihsuper()で呼び出され、 Androidが適切なレイアウトを選択できないようにします。デフォルトのスタイル引数を指定せずに呼び出すと、スーパークラスのコンストラクターが独自に最適なスタイルを選択します。defStyle0super()DialogPreference

于 2012-12-30T14:17:47.023 に答える