In an AlertDialog, how to set the image on the top - java

I am working on a coding exercise,which is about AlertDialog. In the Dialog, I hope the image or view can be placed on the top of the dialog,like a header,but it goes to the bottom.
The XML code:
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="#drawable/star"/>
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:text=" choose your sex"
android:gravity="center_vertical"/>
Activity code:
private void showSingleDialog() {
LayoutInflater factory = LayoutInflater.from(this);
final View view = factory.inflate(R.layout.activity_solo, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);
final String[] sex = {
"male",
"felmale",
"unknow",
"guess"
};
builder.setSingleChoiceItems(sex, 0, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int i) {
Toast.makeText(MainActivity.this, "your choice is:" + sex[i], Toast.LENGTH_LONG).show();
dialog.dismiss();
}
});
builder.show();
}
I tried to place the builder.setView(view) in different place, it still go to the bottom.
Is there any hints for me? Thanks a lot
p.s Sorry for my poor English, I attached the image hereMy Result
I hope the little Star and "choose your sex" go on the top

Alternatively you can achieve the same view with drawable and title methods:
#Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final String[] array = {"male","felmale","unknow","guess"};
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setIcon(R.drawable.ic_star);
builder.setTitle("Choose your sex")
.setSingleChoiceItems(array, -1, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
sex = array[i];
//handle on click
}
});
return builder.create();
}
I achieved the same view like this:

Related

Listview in alertDialog, positioning listview where I want it is where I'm stuck

I have an alertDialog that is read by multiple fragments or activities, on one instance the alert dialog is going to show a listView with 2 editText options plus the standard positive and negative button presses, I want to position the listView after the editTexts and I'm stuck.
Everything displays properly but positioning is where I'm stuck.
Dialog class
public class addTaskDialog extends DialogFragment {
String mString;
taskDialogListener listener;
ArrayList<String> tradeTitles;
/*
* Class interface from jobRoomDetails, interfaces are called from the parent activity class
*/
public interface taskDialogListener {
void onDialogPositiveClick(DialogFragment dialog);
void onDialogNegativeClick(DialogFragment dialog);
void onDialogListSelect();
}
#Override
public void onAttach(#NonNull Context context) {
super.onAttach(context);
try{
listener = (taskDialogListener) context;
} catch(ClassCastException e) {
throw new ClassCastException(getActivity().toString() + "must implement taskDialogListener");
}
}
#Override
public Dialog onCreateDialog(Bundle savedInstanceState){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
AlertDialog alert = builder.create();
mString = getArguments().getString("title");
tradeTitles = getArguments().getStringArrayList("tradeTitleArray");
builder.setTitle(mString);
//Inflate the layout dialog_add_task.xml
LayoutInflater inflater = requireActivity().getLayoutInflater();
//Pattern matcher for literal strings from different addTaskDialog calls
Pattern p = Pattern.compile("Add new task +");
Matcher m = p.matcher(mString);
Pattern q = Pattern.compile("Add Task +");
Matcher n = q.matcher(mString);
/*
*Test for new task and add trade names, this means that the calling window is jobRoomDetails and this is a new task
* and it will be assigned to a trade upon creation
*/
if(m.find()){
Log.d("Line: 56","Test for trade name" + tradeTitles.toString());
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getContext(), android.R.layout.select_dialog_singlechoice, tradeTitles);
//ListView list = (ListView) alert.findViewById(R.id.tradeItems);
builder.setView(inflater.inflate(R.layout.dialog_add_task, null))
.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
//Save the new task to task hashmap
listener.onDialogPositiveClick(addTaskDialog.this);
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
//Cancel operation and return
listener.onDialogNegativeClick(addTaskDialog.this);
}
})
.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
}
});
} else if (n.find()){
builder.setView(inflater.inflate(R.layout.dialog_add_task, null))
.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
//Save the new task to task hashmap
listener.onDialogPositiveClick(addTaskDialog.this);
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
//Cancel operation and return
listener.onDialogNegativeClick(addTaskDialog.this);
}
});
} else {
builder.setView(inflater.inflate(R.layout.dialog_add_task, null))
.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
//Save the new task to task hashmap
listener.onDialogPositiveClick(addTaskDialog.this);
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
//Cancel operation and return
listener.onDialogNegativeClick(addTaskDialog.this);
}
});
}
return builder.create();
}
}
dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<TextView
style="#style/textBox"
android:layout_margin="20dp"
android:layout_marginTop="5dp"
android:text="#string/add_task_ex"/>
<EditText
android:id="#+id/taskNameEditText"
style="#style/editTextBox"
android:hint="#string/add_task_name"
android:inputType="text"/>
<EditText
android:id="#+id/taskCost"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="0"
android:textSize="25sp"
android:inputType="numberDecimal"/>
<FrameLayout
android:id="#+id/tradeListItems"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
android:id="#+id/tradeItems"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</FrameLayout>
</LinearLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
At one point I tried to add it via a listView but to no success, I think the return type on the onCreateDialog might be hindering things but I'm not sure, I think the return type is necessary because I'm bringing through arguments but I could be wrong. As always help is appreciated.
Simple answer is create your own Alert dialog, you can simply make a fragment that looks and acts similar to an alert dialog but with far more functionality.

How to get the value of our custom AlertDialog?

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();
}
});

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

how can i make a confirm dialog?

I have created a todo app in android studio. when you click on the list of task item, it deletes itself. but i want to show a confirm dialog before that.i am using two java classes. MainActivity and Filehelper for this todo app.
so i used this code to delete the item and it was working:
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
items.remove(position);
adapter.notifyDataSetChanged();
Toast.makeText(this, "Deleted", Toast.LENGTH_SHORT).show();
}
And now i am using this code with confirm dialog :
#Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Confirm dialog demo !");
builder.setMessage("You are about to delete all records of database. Do you really want to proceed ?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface parent, int position) {
items.remove(position);
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), "You've changed your mind to delete tasks", Toast.LENGTH_SHORT).show();
}
});
builder.show();
}
but when i run it on my android . i see the dialog. but when i press yes it crash itself. so can you give me the right code. and also tell me the problem of my code?.
MainActivity Code:
public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener {
private EditText ItemET;
private Button btn;
private ListView itemList;
private ArrayList<String> items;
private ArrayAdapter<String> adapter;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ItemET = findViewById(R.id.item_edit_text);
btn = findViewById(R.id.add_btn);
itemList = findViewById(R.id.item_list);
items = FileHelper.readData(this);
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items);
itemList.setAdapter(adapter);
btn.setOnClickListener(this);
itemList.setOnItemClickListener(this);
}
#Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add_btn:
String ItemEntered = ItemET.getText().toString();
if (ItemEntered.trim().isEmpty()) {
Toast.makeText(getApplicationContext(), "Please Enter some detail", Toast.LENGTH_LONG).show();
} else {
adapter.add(ItemEntered);
ItemET.setText("");
FileHelper.writeData(items, this);
Toast.makeText(this, "item Added", Toast.LENGTH_SHORT).show();
}
break;
}
}
// Confirm box
#Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Confirm dialog demo !");
builder.setMessage("You are about to delete all records of database. Do you really want to proceed ?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface parent, int position) {
items.remove(position);
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), "You've changed your mind to delete all records", Toast.LENGTH_SHORT).show();
}
});
builder.show();
}
}
FileHelper Code :
public class FileHelper {
public static final String FILENAME = "listinfo.dat";
public static void writeData(ArrayList<String> items, Context context){
try {
FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(items);
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static ArrayList<String> readData(Context context) {
ArrayList<String> itemList = null;
try {
FileInputStream fis = context.openFileInput(FILENAME);
ObjectInputStream ois = new ObjectInputStream(fis);
itemList = (ArrayList<String>) ois.readObject();
} catch (FileNotFoundException e) {
itemList = new ArrayList<>();
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return itemList;
}
}
here is also my MainActivity.xml
<LinearLayout
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="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_marginTop="12dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="12dp"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="#+id/item_edit_text"
android:hint="Enter Item"
android:layout_width="0dp"
android:layout_weight="1.9"
android:layout_marginRight="20dp"
android:layout_height="wrap_content" />
<Button
android:background="#drawable/layout_bg"
android:id="#+id/add_btn"
android:text="add"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"/>
</LinearLayout>
<ListView
android:background="#drawable/layout_bg"
android:id="#+id/item_list"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:textAlignment="center"
android:layout_marginBottom="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
You can create a method and call it whenever you need it
void confirmDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Discard Data!");// Dialog header
builder.setMessage("Are you sure you want to discard this data?"); //disclaimer text
// yes button
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
edit_text.getText().clear(); //clear EditText
}
});
//No button
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.create().show();
}
Send the logcat picture please. Then it will be easier to identify the problem. Also check
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface parent, int position) {
Toast.makeText(getApplicationContext(), "Check if toast is working or crush. ", Toast.LENGTH_SHORT).show();
}
});
Check toast working when "Yes" button pressed or crushed. Then you will be more sure about the problem.

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