当前位置: 首页 > 知识库问答 >
问题:

片段,如何从片段启动对话框?

上官联
2023-03-14

我读了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;
            }

        }
    }
}

共有2个答案

傅奕
2023-03-14

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

@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
苏边浩
2023-03-14

在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类中的onActivityResul

    @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;
        }
    }
 类似资料:
  • 似乎有很多与这个主题相关的问题。当我阅读大部分时,我有一个问题。通常人们试图制作一个片段,然后从那里生成一个对话片段。所以对话片段在片段中。 在我的例子中,我创建了一个按钮,用于打开工具栏上的dialogfragment。然后我从导航栏打开我的主要片段。因此dialogfragment和我的主片段通过相同的主活动被调用,只是在不同的地方。我无法从片段内部调用对话框片段,因为它在选择菜单选项时被调用

  • 我遇到了一个如何在对话框片段中更新片段的问题。 当我单击过滤器菜单按钮时,会显示一个新的对话框片段,其中包括一个无线电组。 我想在单击ok按钮时更新包含位置列表的片段。 它是PlaceActive的代码,其中包含PlaceFraank: 公共类PlaceActive扩展AppCompatActive{ } 以下是PlaceFragment类的代码: 公共类PlaceFragment扩展了片段{ }

  • 我有一个片段和一个对话框片段,我想在它们之间进行通信:将数据从片段发送到对话框片段,并将数据从对话框片段发送到片段 我阅读了有关和的信息,但我不明白如何正确使用它们向/从发送/接收数据。 任何帮助?

  • 我在中有一组选项卡,每个选项卡都包含自己的片段。当我尝试通过从该片段中启动一个新活动并使用方法时,我的应用程序强制关闭。 在四处寻找了一段时间后,我找到了一个名为startActivityFromFragment的方法的一两个引用,但在搜索了大约一个小时后,我找不到任何关于如何使用它或这是否是我应该使用的方法的解释或示例。 我想我要问的是,从一个活动启动一个新活动和从一个片段启动一个新活动之间是否

  • 亲活性 这意味着,onActivityResult()将在作为该子片段的父片段的片段内部调用refresh。作为连锁反应,refreshDeliveryFragment()将调用这两个子片段中的一个子片段来刷新它们的recyclerview数据。

  • 当地图片段第一次打开时,它调用,并在其中添加一个标记,然后用动画缩放。 我想如果用户点击地图上的一个按钮,地图将重新启动,就像它打开一样,开始与缩放和什么。 我使用belowa的三种方法调用该方法,它给出了相同的错误。