Android 显示来自另一个DialogFragment的DialogFragment
我有一个Android 显示来自另一个DialogFragment的DialogFragment,android,android-dialogfragment,Android,Android Dialogfragment,我有一个DialogFragment,向用户显示选项列表,其中一个选项是“删除”选项,当用户按下删除选项时,我想显示另一个DialogFragment作为确认,不幸的是,确认对话框没有显示 这是我的密码 第一段代码 public class ContactDialogOption extends SherlockDialogFragment { public static final String TAG = ContactDialogOption.class.getSimpleNam
DialogFragment
,向用户显示选项列表,其中一个选项是“删除”选项,当用户按下删除选项时,我想显示另一个DialogFragment作为确认,不幸的是,确认对话框没有显示
这是我的密码
第一段代码
public class ContactDialogOption extends SherlockDialogFragment {
public static final String TAG = ContactDialogOption.class.getSimpleName();
public ContactDialogOption() {
super();
// TODO Auto-generated constructor stub
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle(R.string.options);
builder.setItems(new String[] {
getString(R.string.call), getString(R.string.send_message),
getString(R.string.copy), getString(R.string.edit),
getString(R.string.delete)
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(which == 4) //delete
{
FragmentManager mgr = getActivity().getSupportFragmentManager();
FragmentTransaction ft = mgr.beginTransaction();
Fragment old = mgr.findFragmentByTag("SecondFragment");
if (old != null) {
ft.remove(old);
}
ft.addToBackStack(null);
fragment.show(ft, fragmentTag);
}
}
});
return builder.create();
}
}
这是适用于我的代码:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
if (getArguments() == null) {
throw new InvalidParameterException("The key types dialog needs the protocol id to be in the arguments");
}
if (mCallback == null) {
throw new InvalidParameterException("The key types dialog needs an callback to be set");
}
mProtocolId = getArguments().getInt(ApplicationConstants.FragmentsConstants.PROTOCOL_ID);
final List<KeyTypeEntity> allKeyTypes = BusinessFacade.getInstance(getActivity()).KeyTypeLogic.getAllKeyTypes();
ArrayAdapter<KeyTypeEntity> keyTypeAdapter = new ArrayAdapter<KeyTypeEntity>(getActivity(), android.R.layout.simple_list_item_1, allKeyTypes);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("").setAdapter(keyTypeAdapter, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final KeyTypeEntity keyTypeEntity = allKeyTypes.get(which);
AlertDialog.Builder number = new AlertDialog.Builder(getActivity());
List<String> keyNumbers = new ArrayList<String>();
for (int i = 0; i < 50; i++) {
keyNumbers.add("" + (i + 1));
}
ArrayAdapter<String> kAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, keyNumbers);
number.setTitle("").setAdapter(kAdapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
addNewKey(keyTypeEntity, which + 1);
}
});
number.show();
}
}).setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
mCallback.onDialogClosed();
}
});
mDialog = builder.create();
return mDialog;
}
@覆盖
创建对话框上的公共对话框(Bundle savedInstanceState){
if(getArguments()==null){
抛出新的InvalidParameterException(“密钥类型”对话框需要在参数中包含协议id);
}
if(mCallback==null){
抛出新的InvalidParameterException(“键类型对话框需要设置回调”);
}
mProtocolId=getArguments().getInt(ApplicationConstants.FragmentsConstants.PROTOCOL_ID);
最终列表allKeyTypes=BusinessFacade.getInstance(getActivity()).KeyTypeLogic.getAllKeyTypes();
ArrayAdapter keyTypeAdapter=新的ArrayAdapter(getActivity(),android.R.layout.simple\u list\u item\u 1,allKeyTypes);
AlertDialog.Builder=新建AlertDialog.Builder(getActivity());
builder.setTitle(“”).setAdapter(keyTypeAdapter,新的OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
final KeyTypeEntity KeyTypeEntity=allKeyTypes.get(哪个);
AlertDialog.Builder number=新建AlertDialog.Builder(getActivity());
List keyNumbers=new ArrayList();
对于(int i=0;i<50;i++){
添加(“+(i+1));
}
ArrayAdapter kAdapter=新的ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,keyNumbers);
number.setTitle(“”).setAdapter(kAdapter,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
addNewKey(keyTypeEntity,其中+1);
}
});
number.show();
}
}).setOnCancelListener(新的OnCancelListener(){
@凌驾
public void onCancel(对话框接口对话框){
mCallback.onDialogClosed();
}
});
mDialog=builder.create();
返回mDialog;
}
在第一个单击处理程序中,我只创建一个新对话框并显示它。这将关闭第一个对话框,打开第二个对话框,当用户单击列表中的项目时,将调用第二个单击处理程序
希望这有帮助,我不会太晚:)我遇到了完全相同的问题,当您尝试从
片段打开对话框片段时,这种情况不会发生
我找到的唯一解决方案是修改以下调用:
fragment.show(ft, fragmentTag);
致:
这个解决方案的问题是我们无法处理片段转换
我不明白为什么行为与片段不同。我遇到了同样的问题,即无法从第一个DialogFragment的正单击和负单击侦听器中显示另一个DialogFragment。我的解决方案是立即弹出第一个片段,这允许第二个DialogFragment成功附加和显示
//在添加第二个对话框片段之前调用此函数
activity.getSupportFragmentManager().PopBackbackImmediate()代码>请检查以下代码。希望这将帮助你们很多人
public class SubcategoryFragment extends DialogFragment {
public SubcategoryFragment() {
}
public static SubcategoryFragment newInstance(Integer code, String name) {
SubcategoryFragment fragment = new SubcategoryFragment();
mCode = code;
mTitle = name;
return fragment;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
liststring = new ArrayList<>();
getAdapter();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_subcategory, container, false);
gridView = (GridView) view.findViewById(R.id.sub_grid);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
closeDialog = (ImageView) getDialog().findViewById(R.id.closeDialog);
title = (TextView) getDialog().findViewById(R.id.dialogTitle);
gridView = (GridView) getDialog().findViewById(R.id.sub_grid);
title.setText(String.format("Choose %s", mTitle));
closeDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getDialog().dismiss();
}
});
}
@Override
public Dialog onCreateDialog(@NonNull Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
// request a window without the title
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
// closeDialog = (ImageView) dialog.findViewById(R.id.closeDialog);
return dialog;
}
public void getAdapter() {
gridAdapter = new HomeSubGridViewAdapter(getContext(), R.layout.gridview_custom_layout, liststring);
gridView.setAdapter(gridAdapter);
}
}
如果您觉得有任何问题,请随时询问。您可以将片段管理
传递给newInstance()
方法的第一个对话框片段
,然后您可以使用它来显示新的对话框片段
这是我的密码
private static FragmentManager fragmentManager;
public static PlayListDialog newInstance(Context context, FragmentManager fragmentManager1) {
playListDialog = new PlayListDialog();
mContext = context;
fragmentManager = fragmentManager1;
return playListDialog;
}
@Override
public void createNewPlaylist() {
NewPlayListDialog newPlayListDialog = NewPlayListDialog.newInstance(mContext);
newPlayListDialog.showDialog(fragmentManager.beginTransaction(),fragmentManager.findFragmentByTag("newdialog"));
}
最近,我遇到了这个问题,上面的选项都不适合我。我尝试使用以下方法:
DialogFragment fragment = new MyFragment(); //where MyFragment is my fragment I want to show
fragment.setCancelable(true);
fragment.show(getSupportFragmentManager(), "timePicker");
如果您在活动中使用它(即从活动类调用对话框片段),则这将只起作用
但是,我通过将我的活动实例向下转换为AppCompat活动并使用它调用getSupportFragment()
解决了这个问题,如下所示:
DialogFragment timeFragment = new TimePicker();
timeFragment.setCancelable(true);
AppCompatActivity activity = (AppCompatActivity) getActivity();
timeFragment.show(activity.getSupportFragmentManager(), "timePicker");
我希望这有帮助。。快乐的编码 您可以从另一个DialogFragment调用一个DialogFragment
NewDialogFragment newDialogFragment= new NewDialogFragment();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
newDialogFragment.show(transaction, "New_Dialog_Fragment");
使用以下命令:
getActivity().getSupportFragmentManager
而不是
getChildFragmentManager()。
希望这有帮助。如果您想要kotlin版本,请使用以下选项:
val newDialogFragment = NewDialogFragment()
val transaction: FragmentTransaction =
requireActivity().supportFragmentManager.beginTransaction()
newDialogFragment.show(transaction, "New_Dialog_Fragment")
似乎我不能显示onClick方法中的DialogFragment!!!你想在哪里实例化第二个片段?我真的不明白。。。为什么从你的项目中发布大量与问题无关的代码?它只是把初学者的思维搞乱了
NewDialogFragment newDialogFragment= new NewDialogFragment();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
newDialogFragment.show(transaction, "New_Dialog_Fragment");
val newDialogFragment = NewDialogFragment()
val transaction: FragmentTransaction =
requireActivity().supportFragmentManager.beginTransaction()
newDialogFragment.show(transaction, "New_Dialog_Fragment")