EditTextPreference ダイアログのレイアウトが、。。。

EditTextPreference のダイアログのレイアウトが気に入らない。

f:id:posturan:20160313194621p:plain



このように、メッセージ下にマージンが大きく存在する。

無駄に大きいダイアログでなく、メッセージ文字ももう少し大きいのが欲しい。

f:id:posturan:20160313194615p:plain



DialogPreference を継承して、代わりの EditTextPreference を作る。

この中で defaultValue を参照する正しい方法がわからない。
無理やり参照してみる。

import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.preference.DialogPreference;
import android.preference.PreferenceManager;
import android.text.InputType;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
 * CustomEditTextPreference
 */

public class CustomEditTextPreference extends DialogPreference{
   private Map<String,String> mattrMap;
   private EditText mEditText;
   private String mDefaultValue;

   public CustomEditTextPreference(Context context,AttributeSet attrs){
      super(context, attrs);
      mattrMap = new HashMap<String,String>();
      int attrCount = attrs.getAttributeCount();
      for(int i=0;i < attrCount;i++){
         mattrMap.put(attrs.getAttributeName(i), attrs.getAttributeValue(i));
      }
      mDefaultValue = "";
      if (mattrMap.containsKey("defaultValue")){
         mDefaultValue = mattrMap.get("defaultValue");
         if (mDefaultValue.matches("^@[0-9a-fA-F]+$")){
            mDefaultValue = context.getString(Integer.parseInt(mDefaultValue.substring(1)));
         }
      }

      setSummary(PreferenceManager.getDefaultSharedPreferences(context).getString(mattrMap.get("key"), mDefaultValue));
   }
   @Override
   protected View onCreateDialogView(){
      LinearLayout layout = new LinearLayout(getContext());
      layout.setOrientation(LinearLayout.VERTICAL);
      if (mattrMap.containsKey("dialogMessage")){
         TextView textview = new TextView(getContext());
         textview.setText(mattrMap.get("dialogMessage"));
         textview.setTextAppearance(getContext(), android.R.style.TextAppearance_Medium);
         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
         // left, top, right, bottom
         params.setMargins(20,20,10,10);
         textview.setLayoutParams(params);
         layout.addView(textview);
      }
      mEditText = new EditText(getContext());
      mEditText.setInputType(InputType.TYPE_CLASS_TEXT);
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
      // left, top, right, bottom
      params.setMargins(10,10,10,14);
      mEditText.setLayoutParams(params);
      mEditText.setText(getPersistedString(mDefaultValue));
      layout.addView(mEditText);
      return layout;
   }
   @Override
   protected void onBindDialogView(View view){
      super.onBindDialogView(view);
      mEditText.setSelection(mEditText.getText().length());
      mEditText.requestFocus();
   }
   @Override
   protected void onDialogClosed(boolean positiveResult){
      if (positiveResult){
         String value = mEditText.getText().toString();
         if (value.length()==0){
            persistString(mDefaultValue);
            setSummary(mDefaultValue);
         }else{
            persistString(value);
            setSummary(value);
         }
      }
   }
}