How to get the value of our custom AlertDialog? - java

I created a custom AlertDialog and I want to save the values that the user has set. However I can't access them because Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference.
I am in HomeFragment, I created the AlertDialog and set the layout. I did it like this :
public class HomeFragment extends Fragment implements CustomDialog.CustomDialogListener {
private HomeViewModel homeViewModel;
private View root;
public View onCreateView(#NonNull final LayoutInflater inflater,
final ViewGroup container, Bundle savedInstanceState) {
homeViewModel =
ViewModelProviders.of(this).get(HomeViewModel.class);
root = inflater.inflate(R.layout.fragment_home, container, false);
final TextView textView = root.findViewById(R.id.text_home);
homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
#Override
public void onChanged(#Nullable String s) {
textView.setText(s);
}
});
Button btn_add_apero = (Button) root.findViewById(R.id.btn_add_apero);
btn_add_apero.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(root.getContext());
builder.setTitle("Super un nouvel apéro !");
final EditText name_apero = (EditText)root.findViewById(R.id.edit_apero);
final EditText date_apero = (EditText)root.findViewById(R.id.edit_date);
builder.setView(inflater.inflate(R.layout.layout_dialog, null))
// Add action buttons
.setPositiveButton(R.string.text_add, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
LaperoDatabase db = Room.databaseBuilder(root.getContext(),
LaperoDatabase.class, "lapero_db").allowMainThreadQueries().build();
AperoDao dbApero = db.getAperoDao();
Apero new_apero = new Apero(name_apero.getText().toString(), date_apero.getText().toString());
dbApero.insert(new_apero);
}
})
.setNegativeButton(R.string.text_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
builder.show();
}
});
return root;
}
In my layout_dialog.xml I set the 2 EditText :
<?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:padding="16dp">
<EditText
android:id="#+id/edit_apero"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="#string/edit_apero" />
<EditText
android:id="#+id/edit_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#id/edit_apero"
android:layout_alignParentStart="true"
android:hint="#string/edit_date"
android:layout_alignParentLeft="true" />
</RelativeLayout>
How can I manage to get the value that are in those 2 fields ?

First thing i noticed is that you're using root to find your dialog views, but root points to your fragment layout. root = inflater.inflate(R.layout.fragment_home, container, false);
First inflate your dialog layout before referencing its resource id.
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
View inflater = getLayoutInflater().inflate(R.layout.layout_dialog, null);
builder.setView(inflater);
Then change root to inflater so you reference the view from your dialog layout
final EditText name_apero = (EditText)inflater.findViewById(R.id.edit_apero);
final EditText date_apero = (EditText)inflater.findViewById(R.id.edit_date);
Full code
Button btn_add_apero = (Button) root.findViewById(R.id.btn_add_apero);
btn_add_apero.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
View inflater = getLayoutInflater().inflate(R.layout.layout_dialog, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(inflater);
builder.setTitle("Super un nouvel apéro !");
final EditText name_apero = (EditText)inflater.findViewById(R.id.edit_apero);
final EditText date_apero = (EditText)inflater.findViewById(R.id.edit_date);
// Add action buttons
builder.setPositiveButton(R.string.text_add, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
LaperoDatabase db = Room.databaseBuilder(root.getContext(),
LaperoDatabase.class, "lapero_db").allowMainThreadQueries().build();
AperoDao dbApero = db.getAperoDao();
Apero new_apero = new Apero(name_apero.getText().toString(), date_apero.getText().toString());
dbApero.insert(new_apero);
}
})
builder.setNegativeButton(R.string.text_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
builder.show();
}
});

Related

findViewById respond "none"

I'm trying to getText() from EditText view in an AlertDialog.
In the main activity in the method onCreate() I set the button listener.
public class MainActivity2 extends AppCompatActivity {
private ActivityMain2Binding mainActivity2;
private ArrayAdapter adapter;
private ArrayList<simpleArrayAdapterElement> data;
private final static String KEY_TITLE = "title";
private final static String KEY_DESCRIPTION = "description";
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainActivity2 = ActivityMain2Binding.inflate(getLayoutInflater());
View view = mainActivity2.getRoot();
setContentView(view);
arrayAdapter();
mainActivity2.buttonIddItem.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
showCustomDialog();
}
});
// setupListViewSimple();
}
Then I call the showCustomDialog() in onClick.
private void showCustomDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(R.layout.custom_dialog);
builder.setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
EditText alertDialogText = (EditText) findViewById(R.id.setText1);
System.out.println(alertDialogText.getText());
System.out.println(alertDialogText.getText().toString()); // just in case
}
});
builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
}
});
EditText alertDialogText = (EditText) findViewById(R.id.setText1); // return none
Here is my layout:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<EditText
android:id="#+id/setText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints"
android:layout_marginTop="16dp"
android:hint="Type your name here:"
android:text="Some"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
*I also use binding in my activity.
What I'm doing wrong?
You are referring to MainActivity2 itself. you need to refer to its view by using LayoutInflater. You can check example answer here: https://stackoverflow.com/a/36793463/9346054
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.custom_dialog, null);
builder.setView(dialogView);
builder.setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
EditText alertDialogText = dialogView.findViewById(R.id.setText1);
System.out.println(alertDialogText.getText());
System.out.println(alertDialogText.getText().toString()); // just in case
}
});
builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
}
});

Buttons disappear from DialogFragment when the displayed list requires scrolling

AlertDialog displays the content and buttons perfectly until the contents grow to the point that scrolling is required to display it all. At that point the buttons disappear, even though the list shows in its entirety.
I see that in years gone by this question was asked (this one is essentially identical to mine (DialogFragment buttons pushed off screen API 24 and above), but the answers all seemed hit or miss, haphazard even: setting layout_weight, switching from setMessage() to setTitle(), and finally switching away from AlertDialog to Dialog.
None of these are working form me, and avoiding AlertDialog is NOT an appealing option because I am using the setMultiChoiceItems() method that seems (incredibly to me, perhaps given my extremely limited knowledge) available only to AlertDialog.
Thus in desperation and frustration I appeal directly to the collective brains of stackoverflow.
This is a pared down version of my DialogFragment:
public class SurfaceDialog extends DialogFragment {
#Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = requireActivity().getLayoutInflater();
builder.setView(inflater.inflate(R.layout.surface_dialog, null))
.setTitle(mMessage)
.setMultiChoiceItems(mSurfaceList, mCheckedSurfaces, new DialogInterface.OnMultiChoiceClickListener() {
#Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
mCheckedSurfacesPositions.add(which);
} else {
mCheckedSurfacesPositions.remove(mCheckedSurfacesPositions.indexOf(which));
}
}
});
// builder.setCancelable(false);
builder.setPositiveButton("Done", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
ProcessDialogSelections(mCheckedSurfacesPositions);
dismiss();
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
listener.onSurfaceDialogSelectedSent(mUnitSurfaces);
dismiss();
}
});
return builder.create();
}
That not working, I then coded my own buttons and displayed them:
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = requireActivity().getLayoutInflater();
View dialogView = inflater.inflate(R.layout.surface_dialog, null);
builder.setView(dialogView)
.setTitle(mMessage)
.setMultiChoiceItems(mSurfaceList, mCheckedSurfaces, new DialogInterface.OnMultiChoiceClickListener() {
#Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
mCheckedSurfacesPositions.add(which);
} else {
mCheckedSurfacesPositions.remove(mCheckedSurfacesPositions.indexOf(which));
}
}
});
Button positiveButton = dialogView.findViewById(R.id.positive_button);
Button negativeButton = dialogView.findViewById(R.id.negative_button);
positiveButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
ProcessDialogSelections(mCheckedSurfacesPositions);
dismiss();
}
});
negativeButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
listener.onSurfaceDialogSelectedSent(mUnitSurfaces);
dismiss();
}
});
return builder.create();
}
and here is my revised XML file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
android:orientation="vertical">
</ScrollView>
<Button
android:id="#+id/positive_button"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:layout_width="wrap_content"
android:text="Done"
app:layout_constraintBaseline_toBaselineOf="#+id/negative_button"
app:layout_constraintEnd_toStartOf="#+id/negative_button"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="#+id/negative_button"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:layout_width="wrap_content"
android:text="Cancel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="#+id/positive_button" />
</androidx.constraintlayout.widget.ConstraintLayout>
And with THAT not working, I then followed the advice of Vikas Singh (AlertDialog Buttons not visible when using Custom layout). This is what the new code looks like (essentially creating the layout in Java rather than XML.
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// New code from Vikas Singh
LinearLayout rootLayout = new LinearLayout(getActivity());
rootLayout.setOrientation(LinearLayout.VERTICAL);
ScrollView scrollView = new ScrollView(getActivity());
LinearLayout layout = new LinearLayout(getActivity());
layout.setOrientation(LinearLayout.VERTICAL);
scrollView.addView(layout);
rootLayout.addView(scrollView);
builder.setNegativeButton("Cancel", null);
builder.setPositiveButton("Go", null);
builder.setView(rootLayout);
builder//.setView(dialogView)
//.setTitle(mMessage)
.setMultiChoiceItems(mSurfaceList, mCheckedSurfaces, new DialogInterface.OnMultiChoiceClickListener() {
#Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
mCheckedSurfacesPositions.add(which);
} else {
mCheckedSurfacesPositions.remove(mCheckedSurfacesPositions.indexOf(which));
}
}
});
return builder.create();
}
Still no buttons when I have to scroll.
Why not and what can I do about it?
Here is the solution:
public class SurfaceDialog extends DialogFragment {
#Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
//LayoutInflater inflater = requireActivity().getLayoutInflater();
builder
//.setView(inflater.inflate(R.layout.surface_dialog, null)) didn't work
// nor did setView with android.R.layout.select_dialog_multichoice
// nor android.R.layout.simple_list_item_multiple_choice work
.setTitle(mMessage)
.setMultiChoiceItems(mSurfaceList, mCheckedSurfaces, new DialogInterface.OnMultiChoiceClickListener() {
#Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
mCheckedSurfacesPositions.add(which);
} else {
mCheckedSurfacesPositions.remove(mCheckedSurfacesPositions.indexOf(which));
}
}
});
// builder.setCancelable(false);
builder.setPositiveButton("Done", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
ProcessDialogSelections(mCheckedSurfacesPositions);
dismiss();
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
listener.onSurfaceDialogSelectedSent(mUnitSurfaces);
dismiss();
}
});
return builder.create();
}
The multiChoiceItems DialogFragment now works like a charm!
All I had to do was simply comment out the above lines.
As a result, there is no layout explicitly inflated, no view set.
But it works nonetheless.
Now I would love it if someone could explain to me
the details of why this works,
why the other did not, and
in light of the earlier failure, how could a custom layout be implemented to achieve this result of not losing the action buttons when the view scrolled

Pass Information from AlertDialog to parent Fragment

I am trying to pass Information from my AlertDialog to the parent Fragment it is on. But as soon as you klick the positive button, the app will crash.
I dont really know what todo anymore already read many Posts and articles but could not find the Problem.
Would be great if you could help me out.(Im a beginner)
Here is the Error I get with the first Problem in Code and the second commented.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.test, PID: 20682
java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.test.SchulfachDialog$SchulfachDialogListener.applyTexts(java.lang.String)' on a null object reference
at com.example.test.SchulfachDialog$1.onClick(SchulfachDialog.java:39)
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
here is my code for the alert Dialog:
builder.setView(view)
.setTitle("Add new subject")
.setMessage("Message")
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("ok", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
String name = editTextName.getText().toString();
listener.applyTexts(name); // Problem 1: when positiv Button is pushed this line causes a crash
}
});
editTextName = view.findViewById(R.id.edit_name);
return builder.create();
}
this is the applyTexts which I override in the fragments Code:
public interface SchulfachDialogListener{
void applyTexts(String name);
}
}
#Override public void applyTexts(String name) {
test = name;
}
}
I also have this block in which the 2 commented lines cause a crash when clicking on the button which starts the alert Dialog:
public void onAttach(Context context) {
super.onAttach(context);
try {
listener = (SchulfachDialogListener) context;
} catch (ClassCastException e) {
// throw new ClassCastException(context.toString()+
// "must implement SchulfachDialogListener");
}
}
Solution: To pass data from an alert dialog to a parent fragment, the easier way is let the dialog extends DialogFragment. Then using setTargetFragment and setTargetFragment to send data between them.
Because you do not post parent fragment code, so I assume here is xml and java code of your parent fragment.
MainFragment.java
public class MainFragment extends Fragment implements SchulfachDialogListener{
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
Button btnShowAlertDialog = view.findViewById(R.id.button_show_alert_dialog);
btnShowAlertDialog.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
SchulfachDialog dialog = new SchulfachDialog();
dialog.setTargetFragment(MainFragment.this, 0);
dialog.show(requireActivity().getSupportFragmentManager(), null);
}
});
return view;
}
#Override
public void applyTexts(String text) {
Toast.makeText(requireActivity(), text, Toast.LENGTH_SHORT).show();
}
}
fragment_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Show Alert Dialog"
android:id="#+id/button_show_alert_dialog"/>
</LinearLayout>
Let the alert dialog extends DialogFragment.
public class SchulfachDialog extends DialogFragment {
private EditText editTextName;
#NonNull
#Override
public Dialog onCreateDialog(#Nullable Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
View view = LayoutInflater.from(requireActivity()).inflate(R.layout.dialog_schulfach, null);
builder.setView(view)
.setTitle("Add new subject")
.setMessage("Message")
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("ok", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
String name = editTextName.getText().toString();
SchulfachDialogListener listener = (SchulfachDialogListener) getTargetFragment();
listener.applyTexts(name);
}
});
editTextName = view.findViewById(R.id.edit_name);
return builder.create();
}
}

Dynamic linearlayout in DialogFragment for Android (Java)

I set the view to a layout with scrollview and linearlayout, and set a button added in the title to add new row in the linearlayout, but new row does not appear, any tips? I plan to use this DialogFragment as a BLE search, is this a good way to solve it?
public class BLE_Devices_Fragment extends DialogFragment {
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout to use as dialog or embedded fragment
return inflater.inflate(R.layout.fragment_ble_devices, container, false);
}
#Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
LinearLayout layout = inflater.inflate(R.layout.fragment_ble_devices, null).findViewById(R.id.deviceList);
View titleView = inflater.inflate(R.layout.bluetoothscan_title, null, false);
ImageButton syncBLEButton = titleView.findViewById(R.id.syncBLEButton);
syncBLEButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
layout.addView(new Button(layout.getContext()));
}
});
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.setCustomTitle(inflater.inflate(R.layout.bluetoothscan_title, null)).create();
builder.setView(inflater.inflate(R.layout.fragment_ble_devices, null));
// Create the AlertDialog object and return it
return builder.create();
}
}
Replace
builder.setView(inflater.inflate(R.layout.fragment_ble_devices, null));
with
builder.setView(layout);
Solved: had to set the views instead, not create new ones.

How to get string-input from AlertDialogBox (EditText.xml)

Here is the method where I need to get the text from the EditText of AlertDialog
public void checkButton() {
leggspillere = (Button) findViewById(R.id.leggspillere);
final LayoutInflater inflater = this.getLayoutInflater();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(inflater.inflate(R.layout.create_user,null));
builder.setMessage("Lag en spiller");
builder.setCancelable(true);
builder.setPositiveButton("Ok",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// trying to get the EditText-string inside alertdialogbox input here.
final String Name = UserName.
Person person = new Person(Name, 0);
dialog.dismiss();
spillere.setText(person.getName() + " " + person.getScore());
}
}
);
//sette andre knappen "cancel"
builder.setNegativeButton("no",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
}
);
AlertDialog alert = builder.create();
alert.show();
}
XML:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="match_parent"
android:layout_height="64dp"
android:scaleType="center"
android:background="#FFFFBB33"
android:contentDescription="#string/app_name" />
<EditText
android:id="#+id/UserName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginTop="16dp"
android:inputType="textEmailAddress" />
</LinearLayout>
Trying to get the input/string from EditText.xml to make a person object.
Always referencing to a null object. I can't find any solution, point me somewhere.
How are you trying to access the editText inside DialogInterface.OnClickListener?
Try getting the inflated view in a View object and do findViewById on that View object variable. This code below should work fine:
LayoutInflater inflater = this.getLayoutInflater();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final View dialogView = inflater.inflate(R.layout.dialog_alert, null);
builder.setView(dialogView);
builder.setMessage("Lag en spiller");
builder.setCancelable(true);
builder.setPositiveButton("Ok",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
EditText editText = (EditText) dialogView.findViewById(R.id.d_alert_et);
Log.v("tag", "Edit text value: " + editText.getText());
}
});
builder.setNegativeButton("no",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
Basically get the inflated view in a View Object:
final View dialogView = inflater.inflate(R.layout.dialog_alert, null);
And then do findViewById on that View Object:
EditText editText = (EditText) dialogView.findViewById(R.id.d_alert_et);
editText.getText()
Pls. refer this code : https://www.mkyong.com/android/android-custom-dialog-example/
// custom dialog
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.custom);
dialog.setTitle("Title...");
// set the custom dialog components - text, image and button
TextView text = (TextView) dialog.findViewById(R.id.text);
text.setText("Android custom dialog example!");
ImageView image = (ImageView) dialog.findViewById(R.id.image);
**EditText edtName = (EditText) dialog.findViewById(R.id.edtName);**
image.setImageResource(R.drawable.ic_launcher);
Button dialogButton = (Button)
dialog.findViewById(R.id.dialogButtonOK);
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
**String s = edtName.getText().toString();**
dialog.dismiss();
}
});
dialog.show();
}
i prefer to use Material Dialog library because it's very easy to use.
you can use custom view or use the simple input
1.simple input example from my project:
new MaterialDialog.Builder(this)
.title(R.string.input)
.content(R.string.input_content)
.inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)
.input(R.string.input_hint, R.string.input_prefill, new MaterialDialog.InputCallback() {
#Override
public void onInput(MaterialDialog dialog, CharSequence input) {
// Do something
}
}).show();
2.custom view example :
View view = LayoutInflater.from(context).inflate(R.layout.dialog_new_queue, null, false);
MaterialDialog dialog = new MaterialDialog.Builder(context)
.customView(view, false).build();
AutoCompleteTextView tv = view.findViewById(R.id.dialog_add_q_tv);
Button btn = view.findViewById(R.id.dialog_add_queue_btn);
btn.setOnClickListener(v -> {
String input = tv.getText().toString().trim();
Observable
.create(emitter -> {
if (input.isEmpty()) {
emitter.onError(new IllegalArgumentException("اسم صف خالی است"));
} else if (dao.getQueue(pref.getLastUsername(), input) != null) {
emitter.onError(new IllegalArgumentException("این اسم تکراری است!"));
} else {
QueueModel q = new QueueModel(input, pref.getLastUsername(), System.currentTimeMillis());
dao.insert(q);
emitter.onComplete();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(o -> {},e ->{
tv.setError(e.getMessage());
tv.requestFocus();
},() -> {
Toast.makeText(context, "صف جدید ساخته شد", Toast.LENGTH_SHORT).show();
dialog.dismiss();
loadData();
});
});
dialog.show();
Replace the 2 lines:
final String Name = UserName.
Person person = new Person(Name, 0);
By
EditText editText = (EditText) dialogView.findViewById(R.id.UserName);
Person person = new Person(editText.getText(), 0);
Try this
public void checkButton() {
leggspillere = (Button) findViewById(R.id.leggspillere);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
builder.setView(inflater.inflate(R.layout.create_user, null));
builder.setMessage("Lag en spiller");
builder.setCancelable(true);
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//Change here
Dialog myDialog = (Dialog) dialog;
EditText editText = (EditText) myDialog.findViewById(R.id.UserName);
Person person = new Person(editText.getText(), 0);
}
})
//sette andre knappen "cancel"
builder.setNegativeButton("no", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
builder.create().show();
}

Categories

Resources