Let's say I have this layout:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageButton android:id="@+id/add_dep_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_marginEnd="5dp" android:layout_marginRight="5dp" android:src="@android:drawable/ic_input_add" /> <EditText android:id="@+id/add_dep_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/add_dep_btn" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignTop="@id/add_dep_btn" android:layout_marginLeft="5dp" android:layout_marginStart="5dp" android:layout_toLeftOf="@id/add_dep_btn" android:layout_toStartOf="@id/add_dep_btn" /> <android.support.v7.widget.RecyclerView android:id="@+id/dep_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/add_dep_btn" /> <TextView android:id="@+id/empty_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/add_dep_text" android:layout_margin="20dp" android:gravity="center" android:text="@string/no_dep" android:textSize="22sp" /> </RelativeLayout>
And I use it in a DialogFragment:
class DepartmentChoiceDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val builder = AlertDialog.Builder(activity) builder.setTitle(R.string.choose_or_create_dep) .setView(R.layout.department_chooser_dialog) .setNegativeButton(android.R.string.cancel, { d, i -> d.cancel() }) return builder.create() } }
if I refer to the widget using synthetic:
override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dep_list.layoutManager = LinearLayoutManager(activity) dep_list.itemAnimator = DefaultItemAnimator() dep_list.setHasFixedSize(true) }
I got this error at runtime:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference at MyDialog._$_findCachedViewById(DepartmentChoiceDialog.kt:0)
I don't understand how to use synthetic in DialogFragment case. It works fine in Fragment and Activity.
Dialog: A dialog is a small window that prompts the user to make a decision or enter additional information. DialogFragment: A DialogFragment is a special fragment subclass that is designed for creating and hosting dialogs.
Synthetic properties to access views were created as a way to eliminate the common boilerplate of findViewById calls. These synthetics are provided by JetBrains in the Kotlin Android Extensions Gradle plugin (not to be confused with Android KTX).
I found a way that works for custom dialogs.
class ServerPickerDialogFragment: AppCompatDialogFragment() { // Save your custom view at the class level lateinit var customView: View; override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { // Simply return the already inflated custom view return customView } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { // Inflate your view here customView = context!!.layoutInflater.inflate(R.layout.dialog_server_picker, null) // Create Alert Dialog with your custom view return AlertDialog.Builder(context!!) .setTitle(R.string.server_picker_dialog_title) .setView(customView) .setNegativeButton(android.R.string.cancel, null) .create() } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // Perform remaining operations here. No null issues. rbgSelectType.setOnCheckedChangeListener({ _, checkedId -> if(checkedId == R.id.rbSelectFromList) { // XYZ } else { // ABC } }) } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With