【问题标题】:Fragments, how to start Dialog from fragment?片段,如何从片段开始对话框?
【发布时间】:2013-07-31 18:08:13
【问题描述】:

我读了DialogFragment,并像这样合二为一。

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;

public class MyDialogFragment extends DialogFragment {
public static MyDialogFragment newInstance(int title) {
    MyDialogFragment frag = new MyDialogFragment();
    Bundle args = new Bundle();
    args.putInt("title", title);
    frag.setArguments(args);
    return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    int title = getArguments().getInt("title");

    return new AlertDialog.Builder(getActivity())
            .setIcon(R.drawable.plus_icon)
            .setTitle(title)
            .setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        AddExerciseFragment.doPositiveClick();
                    }
                }
            )
            .setNegativeButton("NO",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                       AddExerciseFragment.doNegativeClick();
                    }
                }
            )
            .create();
}

}

在另一个 SherlockFragment 中我制作下一个:

public void doPositiveClick() {


}

public  void doNegativeClick() {


}
void showDialog() {
    DialogFragment newFragment = MyDialogFragment.newInstance(
            R.string.name);
    newFragment.show(getFragmentManager(), "dialog");
}

但是方法 doPositiveClick(),doNegativeClick() 想要是静态的 - 这对我不利。

public void doPositiveClick() {
    DialogFlag = 0;
    Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
    photoPickerIntent.setType("image/*");
    startActivityForResult(photoPickerIntent, GALLERY_REQUEST);
    // dialog.cancel();

}


@Override
public void onActivityResult(int requestCode, int resultCode,
        Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    String path = null;
    if (DialogFlag == 0) {


        switch (requestCode) {
        case GALLERY_REQUEST:
            if (resultCode == RESULT_OK) {
                Uri selectedImage = imageReturnedIntent.getData();
                path = getRealPathFromURI(selectedImage);
                Log.d("myLogs", path);
                if (btnID == 1) {
                    pathOne = path;
                    Bitmap bmImg = BitmapFactory.decodeFile(pathOne);
                    ivOne.setImageBitmap(bmImg);
                    one = bmImg;
                } else {
                    pathTwo = path;
                    Bitmap bmImg = BitmapFactory.decodeFile(pathTwo);
                    ivTwo.setImageBitmap(bmImg);
                    two = bmImg;
                }

            }
        }
    }
    if (DialogFlag == 1) {
        Uri uri;
        if (requestCode == CAMERA_RESULT) {
            Cursor cursor = getActivity().getContentResolver().query(
                    Media.EXTERNAL_CONTENT_URI,
                    new String[] { Media.DATA, Media.DATE_ADDED,
                            MediaStore.Images.ImageColumns.ORIENTATION },
                    Media.DATE_ADDED, null, "date_added ASC");
            if (cursor != null && cursor.moveToFirst()) {
                do {
                    uri = Uri.parse(cursor.getString(cursor
                            .getColumnIndex(Media.DATA)));
                    path = uri.toString();
                } while (cursor.moveToNext());
                cursor.close();
            }
            Log.d("myLogs", path);
            if (btnID == 1) {
                pathOne = path;
                Bitmap bmImg = BitmapFactory.decodeFile(pathOne);
                ivOne.setImageBitmap(bmImg);
                one = bmImg;
            } else {
                pathTwo = path;
                Bitmap bmImg = BitmapFactory.decodeFile(pathTwo);
                ivTwo.setImageBitmap(bmImg);
                two = bmImg;
            }

        }
    }
}

【问题讨论】:

  • 我无法调用 getActivity()
  • 这是为什么呢? developer.android.com/guide/topics/ui/controls/pickers.html。检查 timepicker 这是一个静态类。此外,如果您有一个静态内部类,您可以使用对活动上下文的弱引用
  • 我无法在 Fragments 静态方法中调用 getActivity,它们在非静态方法中使用 getActivity
  • 查看我的帖子。我使用了一个布尔值。我通过单击对话框片段中的按钮获得片段中的值。基于布尔值调用正点击方法或负点击方法。

标签: android static dialog android-fragments


【解决方案1】:

在你的 Fragment 类中

在下面声明

public static final int DIALOG_FRAGMENT = 1;
public static final int RESULT_OK = 101;

然后

   DialogFragment newFragment = MyDialogFragment.newInstance(
        R.string.name);
   newFragment.setTargetFragment(SherLockFragmentName.this, DIALOG_FRAGMENT); 
   newFragment.show(getFragmentManager(), "dialog");

然后在对话框片段中

    .setPositiveButton("OK",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    Intent i =getActivity().getIntent();
                    i.putExtra("key", true);
                    getTargetFragment().onActivityResult(getTargetRequestCode(), 101, i);
                }
            }
        )
        .setNegativeButton("NO",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                   //AddExerciseFragment.doNegativeClick();
                    Intent i =getActivity().getIntent();
                    i.putExtra("key", false);

                    getTargetFragment().onActivityResult(getTargetRequestCode(), 101, i);
                }
            }
        )

然后在 Fragment 类中覆盖onActivityResult

    @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch(requestCode) {
            case DIALOG_FRAGMENT:

                if (resultCode == RESULT_OK) {
                    boolean check = data.getBooleanExtra("key", true);
                    if(check)
                    {
                        dopositiveClick();
                    }
                    else
                    {
                        donegativeClick();
                    }
                } 
                break;
        }
    }

【讨论】:

  • “然后在 Fragment 类中覆盖 onActivityResult”我不能两次覆盖这个方法。我有一个inActivityResult,看看我的问题
  • 不要像以前一样使用 if else 覆盖两次覆盖?或开关盒。
  • 如果你觉得这很难使用接口并在你的片段中实现一个接口。基于布尔值调用适当的方法
  • 现在对我来说很难,因为我正在编程大约 18 个小时,现在它有很多变量)
  • @KostyaKhuta 如果很难,您应该重新考虑您的设计以使其变得简单。我肯定会重新考虑改变设计。
【解决方案2】:

如果您不想要静态访问,这里还有另一种选择:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int title = getArguments().getInt("title");

final AddExerciseFragment aef = new AddExerciseFragment(SomeParameters...);

return new AlertDialog.Builder(getActivity())
            .setIcon(R.drawable.plus_icon)
            .setTitle(title)
            .setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton){
                        aef.doPositiveClick();
                    }
//and so on

【讨论】:

  • 但是当我从 doPositiveClick() startActivityForResult - 我得到错误 AddExerciseFragment not attach to Activity
  • @KostyaKhuta 引用文档 所有片段到片段的通信都是通过关联的活动完成的。两个 Fragment 永远不应该直接通信。
  • 你能帮帮我吗?我从 FragmentA 启动 Dialog,当我按下肯定按钮时 - 我必须 startActivityForResult - 结果将保存在这个 FragmentA 中。我用两种方法编辑我的 questinn。
  • @KostyaKhuta stackoverflow.com/questions/10905312/…。检查这可能会有所帮助。
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多