読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

DialogのEditorのFragment用、名付けてDialogEditor For Fragment

前回の続き。http://d.hatena.ne.jp/ria10/20121120/1353383249

これがFragmentでは使えなかったのでFragmentで使えるようにがんばってみた。。

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
        >

    <EditText android:id="@+id/dialog_editor_edit_text"
              android:layout_width="match_parent"
              android:layout_height="0dp"
              android:layout_weight="1"
              android:gravity="top|left"
              android:lines="3"
              android:hint="@string/common_hint"
            />

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="horizontal"
                  android:gravity="right"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
            >
        <TextView android:id="@+id/dialog_editor_counter_numerator"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:paddingRight="10dp"
                  android:text="@string/none"
                />
        <TextView android:id="@+id/dialog_editor_counter_delimiter"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:paddingRight="10dp"
                  android:text="@string/counter_delimiter"
                />
        <TextView android:id="@+id/dialog_editor_counter_denominator"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:paddingRight="10dp"
                  android:text="@string/none"
                />
    </LinearLayout>

    <Button android:id="@+id/dialog_editor_ok_btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/ok"
            />

</LinearLayout>
package net.anyroute.android;

import android.app.Dialog;
//import android.app.DialogFragment; ←間違わないように注意!
import android.support.v4.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

/**
 * Date: 2012/11/20
 * Time: 10:55
 */
public class DialogEditor extends DialogFragment {
    private static final String TAG = DialogEditor.class.getSimpleName();

    // TODO 排他制御 http://eggdev.blogspot.jp/2012/08/blog-post_4.html

    private EditText mBoundEditText;
    private TextView mNumerator;
    private TextView mDenominator;
    private EditText mEditText;
    private Button mOKButton;
    private int mLimit;

    public static DialogEditor newInstance(EditText editText, int limit) {
        DialogEditor dialogEditor = new DialogEditor();
        dialogEditor.mBoundEditText = editText;
        dialogEditor.mLimit = limit;

        return dialogEditor;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);

        return dialog;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.dialog_editor, container, false);

        getDialog().setTitle(mBoundEditText.getHint().toString());

        mEditText = (EditText) v.findViewById(R.id.dialog_editor_edit_text);
        mNumerator = (TextView) v.findViewById(R.id.dialog_editor_counter_numerator);
        mDenominator = (TextView) v.findViewById(R.id.dialog_editor_counter_denominator);
        mOKButton = (Button) v.findViewById(R.id.dialog_editor_ok_btn);

        mDenominator.setText(String.valueOf(mLimit));
        mNumerator.setText(String.valueOf(mBoundEditText.getText().length()));
        mEditText.setText(mBoundEditText.getText().toString());

        mEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
                // nothing to do.
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
                if (charSequence.length() > mLimit) {
                    mNumerator.setTextColor(getDialog().getContext().getResources().getColor(R.color.alert_red));
                    mOKButton.setEnabled(false);

                } else {
                    mNumerator.setTextColor(getDialog().getContext().getResources().getColor(android.R.color.black));
                    mOKButton.setEnabled(true);
                }
                mNumerator.setText(String.valueOf(charSequence.length()));
            }

            @Override
            public void afterTextChanged(Editable editable) {
                // nothing to do.
            }
        });

        mOKButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mBoundEditText.setText(mEditText.getText().toString());

                getDialog().dismiss();

            }
        });

        showSoftwareKeyboard(getDialog(), mEditText);

        return v;
    }



    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        mBoundEditText.setText(mEditText.getText().toString());
    }

    private void showSoftwareKeyboard(final Dialog dialog, EditText editText) {
        editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                if (b) {
                    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                }
            }
        });
    }


}


こっちはdialog.getWindow().getAttributes()がうまく動かないので見た目の調整を別の方法でやらねばならず、レスポンシブなやり方がまだ見つかってないのと、TODOに書いてあるけど複数呼び出しうるので排他の制御が必要っぽ。にょいんにょいんするのも解決してない。

にょいんにょいんするのは、ダイアログは真ん中らへんにでてくるせいなんだけど、ダイアログで出現場所の制御はできないっぽいから、根本的に変えないとダメかも。。まぁ、余裕が出てきてから対応しよう。


追記)これ、なぜかIS05(Android2.3.4)でjava.lang.NoClassDefFoundError:がでる・・・。他の2.3.xでも出るのかな。。。

追記)原因が分かった。DialogFragmentのインポートがサポートライブラリのではなくて組み込みのやつだったっていう。。。