活动中自定义对话框内的 ANDROID 片段

Posted

技术标签:

【中文标题】活动中自定义对话框内的 ANDROID 片段【英文标题】:ANDROID fragment inside a custom dialog in activity 【发布时间】:2016-11-03 18:52:40 【问题描述】:

我想在活动的自定义对话框中放置一个片段。

我收到此错误:

java.lang.IllegalArgumentException: No view found for id 0x7f0c007e (copyworld.rebootcw:id/container_schedule1) for fragment FragmentGiorno418215c0 #0 id=0x7f0c007e

这是我的代码:

layout.xml

<FrameLayout
    android:layout_
    android:layout_
    android:layout_below="@+id/spinner_dialog_schedulazione"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:id="@+id/container_schedule1">

</FrameLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity 


      @Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

 Popup_schedule();



//******POPUP PER LA SCHEDULAZIONE******************

public void Popup_schedule() 
    dialog_schedule=new Dialog(MainActivity.this);
    dialog_schedule.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    dialog_schedule.setContentView(R.layout.dialog_schedule);
    dialog_schedule.setCancelable(false);
    lp = new WindowManager.LayoutParams();
    window = dialog_schedule.getWindow();
    lp.copyFrom(window.getAttributes());
    lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
    dialog_schedule.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    window = dialog_schedule.getWindow();
    window.setAttributes(lp);


                 FragmentGiorno fragment = new FragmentGiorno();
                 android.support.v4.app.FragmentTransaction fragmentTransaction =
                         getSupportFragmentManager().beginTransaction();
                 fragmentTransaction.replace(R.id.container_schedule1, fragment);
                 fragmentTransaction.commit();

    dialog_schedule.show();



如何在扩展 Activity 的 MainActivity.java 中的自定义对话框中添加片段?

【问题讨论】:

我尚未对此进行测试,但想指出几个潜在的问题 - onCreate() 将内容视图设置为 R.id.activity_main,但您的帖子提到了 layout.xml。只需检查这实际上是您的 res / layout 文件夹中的activity_main.xml。其次,android:layout_below="@+id/spinner_dialog_schedulazione" 不应在 @ 符号后包含 +,因为您所指的元素应该有自己的 ID(而不是尝试创建一个) 您的activity_main.xml 是否包含ID 为container_schedule1FrameLayout ?? 对不起,我的布局是activity_main.xml container_schedule1 位于 dialog_custom.xml 中 【参考方案1】:

试试这个

 dialog_schedule.findViewById(R.id.container_schedule1)

代替

 R.id.container_schedule1

在你的代码中

【讨论】:

我试试这个:FrameLayout container_schedule=(FrameLayout)dialog_schedule.findViewById(R.id.container_schedule); 把 container_schedule 片段替换或直接作为我的答案【参考方案2】:

如果你想在对话框中加载片段,那么你可以使用DialogFragment

下面是使用DialogFragment的工作示例。

public class Demo extends DialogFragment

View mainView;

LinearLayout layoutArrow;

Bundle bundle;
ArrayList<BookingDetail> bookingDetails;
View.OnClickListener onClickListener;
public static Demo newInstance(@NonNull ArrayList<BookingDetail> bookingDetails) 
    Demo alertPopUpMapReservedBedInfo = new Demo();
    Bundle args = new Bundle();
    args.putSerializable("bookingDetails", bookingDetails);
    alertPopUpMapReservedBedInfo.setArguments(args);

    return alertPopUpMapReservedBedInfo;


@Override
public void onCreate(@Nullable Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, R.style.InvitationDialogWithSimpleAnim);
    bundle = getArguments();



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    mainView = inflater.inflate(R.layout.alert_info, container, false);
    getDialog().setCanceledOnTouchOutside(true);

    return mainView;


@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) 
    super.onViewCreated(view, savedInstanceState);
    init();


private void init() 
    layoutArrow = (LinearLayout) mainView.findViewById(R.id.layoutArrow);

 FragmentGiorno fragment = new FragmentGiorno();
             android.support.v4.app.FragmentTransaction fragmentTransaction =
                     this.getChildFragmentManager().beginTransaction();
             fragmentTransaction.replace(R.id.container_schedule1, fragment);
             fragmentTransaction.commit();




@Override
public void onDismiss(DialogInterface dialog) 
    super.onDismiss(dialog);
    if(onClickListener!=null)
        onClickListener.onClick(null);
    


然后调用它,

    Demo newFragment = Demo.newInstance(bookingDetails);
    newFragment.show(ft,"dialog");

【讨论】:

为什么人们会误解这些问题...对话片段和对话中的片段(根据 OP 的问题)不是一回事。一个片段可能已经有代码和逻辑,一个对话框片段基本上是从头开始编写另一个片段

以上是关于活动中自定义对话框内的 ANDROID 片段的主要内容,如果未能解决你的问题,请参考以下文章

自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?

如何在 Android 中自定义权限对话框?

在android中的类内的对话框片段的线性布局中添加textview

为啥软键盘在对话框片段内的 Web 视图中不起作用?

在片段活动中显示自定义对话框

在 Android Studio 中看不到对话框片段