活动中自定义对话框内的 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_schedule1
的FrameLayout
??
对不起,我的布局是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 传递进度?