0

フラグメントを使用してアプリを開発していますが、フラグメントの 1 つに ImageButton があります。EditText に入力した内容を保存するかどうかをユーザーに尋ね、Enter キーを押した場合はそれを SQLiteDatabase に保存することになっています。onKeyDown をオーバーライドする必要がないことを除いて、この Fragment が Activity の場合、これはすべて正常に機能しました。Fragment に移動したので、ImageButton は何もしません。私は何が欠けていますか?コードは次のとおりです。

 <EditText
        android:id="@+id/stitchnotes"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="left"
        android:hint="@string/hint"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textColor="@android:color/white"
        android:inputType="text" />

    <ImageButton
        android:id="@+id/savebutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/video_content_description"
        android:src="@drawable/actions_file_save_as_icon" />   

ここからの手法を使用して、フラグメント アクティビティを拡張するアクティビティの onKeyDown メソッドをオーバーライドしています。

public class StitchList extends FragmentActivity {
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    super.onKeyDown(keyCode, event);
    DetailFrag frag = new DetailFrag();
    frag.onKeyDown(keyCode, event);
    return false;
}

次に、フラグメントで onKeyDown を定義します。

public class DetailFrag extends Fragment {
public static boolean Edited = false;
public AlertDialog.Builder builder;
public AlertDialog alert;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.detailfragment, container, false);
    Typeface font = Typeface.createFromAsset(getActivity().getAssets(),
            "danielbk.ttf");

    builder = new AlertDialog.Builder(getActivity());
    builder.setMessage("Do you want to save your Notes?");
    builder.setCancelable(false);

    builder.setPositiveButton("Yes",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    dialog.cancel();
                }
            });

    builder.setNegativeButton("No",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    getActivity().finish();
                }
            });

    alert = builder.create();

    final EditText notes = (EditText)view.findViewById(R.id.stitchnotes);
    notes.setTypeface(font);
    notes.setTextSize(12);

    ImageButton savebutton = (ImageButton)view.findViewById(R.id.savebutton);
    savebutton.setOnClickListener(new ImageButton.OnClickListener() {

        public void onClick(View v) {
            String Notes = notes.getText().toString();
            Uri updateUri = ContentUris.withAppendedId(STITCHES_URI, rowID);
            ContentValues values = new ContentValues();
            values.put("stitchnotes", Notes);
            getActivity().getContentResolver().update(updateUri,values,null,null);
        }
    });
    notes.addTextChangedListener(new TextWatcher() {

        @Override
        public void afterTextChanged(Editable s) {

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start,
                int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start,
                int before, int count) {
            Edited = true;

        }
    });

    return view;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0
            && Edited) {
        alert.show();
        return true;
    }
    else
        return false;
}
4

1 に答える 1

2

現在、あなたのonKeyDownメソッドではFragmentActivity、キーが押されるたびに新しいフラグメントを作成しようとしていますが、それをFragmentManager

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    super.onKeyDown(keyCode, event);
    // Creates a new DetailFrag
    DetailFrag frag = new DetailFrag();
    // Call the onKeyDown in the new Fragment
    frag.onKeyDown(keyCode, event);
    return false;
}

DetailFragから既存のものを取得したいFragmentManager場合、次のようになります。

DetailFrag f = (DetailFrag) getFragmentManager().findFragmentByTag("MyTag");

また

DetailFrag f = (DetailFrag) getFragmentManger().findFragmentById(R.id.fragment);

フラグメントを取得したら、onKeyDownメソッドを呼び出すことができます。

また、がクリックDetailFragされたときにアラートをポップアップ表示する場合は、メソッドImageButtonを呼び出す必要があります。alert.show()onClick

savebutton.setOnClickListener(new ImageButton.OnClickListener() {

    public void onClick(View v) {
        alert.show();
        ....
    }
});

そして、データベースを更新するメソッドは、 の のonClickメソッドに入ります。今は、単に dis を呼び出しPositiveButtonているだけです。Dialogdialog.cancel()

builder.setPositiveButton("Yes",
        new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                String Notes = notes.getText().toString();
                Uri updateUri = ContentUris.withAppendedId(STITCHES_URI, rowID);
                ContentValues values = new ContentValues();
                values.put("stitchnotes", Notes);
                getActivity().getContentResolver().update(updateUri,values,null,null);
            }
        });
于 2012-11-26T23:24:44.587 に答える