Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kotlin synthetic and custom layout in DialogFragment

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.

like image 919
Geob-o-matic Avatar asked Dec 27 '15 23:12

Geob-o-matic


People also ask

What is the difference between dialog & DialogFragment?

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.

What is kotlin synthetic properties?

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).


1 Answers

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       }     })   } } 
like image 188
Sabaat Ahmad Avatar answered Oct 11 '22 15:10

Sabaat Ahmad