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のインポートがサポートライブラリのではなくて組み込みのやつだったっていう。。。