Android: Dialog Builder multipleselection setting array - java

I'm trying to follow the android docs about multiple selection dialog boxes. I'm having an issue, and I think it's with the type of arrays i'm trying to load in.
public void addCondition(View view){
ArrayList<String> mHelperNames= new ArrayList<String>();
mHelperNames.add("Test Item");
mHelperNames.add("Test Item");
mHelperNames.add("Test Item");
mSelectedItems = new ArrayList();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("My Title")
.setMultiChoiceItems(mHelperNames, null,
new DialogInterface.OnMultiChoiceClickListener() {
#Override
public void onClick(DialogInterface dialog, int which,
boolean isChecked) {
if (isChecked) {
mSelectedItems.add(which);
} else if (mSelectedItems.contains(which)) {
mSelectedItems.remove(Integer.valueOf(which));
}
}
})
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
//Create onlcick method
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
//Create onlcick method
}
});
builder.show();
}
Above is my code, but it's red-line city in eclipse:
In the docs, mSelectedItems is never declared, and I'm not too sure what I'm declaring it as.
The error on .SetMultipleChoiceItems is:
The method setMultiChoiceItems(int, boolean[], DialogInterface.OnMultiChoiceClickListener) in the type AlertDialog.Builder is not applicable for the arguments (ArrayList, null, new DialogInterface.OnMultiChoiceClickListener(){})
But if i change it from a string, how do I show text items in it? Any help will be really appreciated.
Tom

You must provide a CharSequence[] to setMultiChoiceItems method, not an ArrayList.
You could create mHelperNames like this:
CharSequence[] mHelperNames = new CharSequence[] { "test item 1", "test item 2" };
And don't forget to declare mSelectedItems too:
final List<Integer> mSelectedItems = new ArrayList<Integer>();
(It has to be final because you access it from an inner class)
You can also keep mHelperNames as an ArrayList if you need to modify it later. Then you need to convert it to an array when calling setMultiChoiceItems:
List<CharSequence> mHelperNames = new ArrayList<CharSequence>();
mHelperNames.add("Test Item 1");
mHelperNames.add("Test Item 2");
final List<Integer> mSelectedItems = new ArrayList<Integer>();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("My Title")
.setMultiChoiceItems(mHelperNames.toArray(new CharSequence[mHelperNames.size()]), null,
new DialogInterface.OnMultiChoiceClickListener() {
#Override
public void onClick(DialogInterface dialog,
int which, boolean isChecked) {
if (isChecked) {
mSelectedItems.add(which);
} else if (mSelectedItems.contains(which)) {
mSelectedItems.remove(Integer
.valueOf(which));
}
}
})

Related

Pass arrayList to setMultiChoiceItems in dialog

I am implementing a simple dialog with a checked listview in it. This is what I've done so far:
CharSequence[] items = {"Brand A", "Brand B", "Brand C"};
AlertDialog.Builder builder = new AlertDialog.Builder(StrengthOfDemandsView.this);
builder.setTitle("Select Brands");
final ArrayList seletedItems=new ArrayList();
builder.setMultiChoiceItems(items, null,
new DialogInterface.OnMultiChoiceClickListener() {
// indexSelected contains the index of item (of which checkbox checked)
#Override
public void onClick(DialogInterface dialog, int indexSelected,
boolean isChecked) {
if (isChecked) {
seletedItems.add(indexSelected);
} else{
seletedItems.remove(Integer.valueOf(indexSelected));
}
}
})
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
}
});
dialog = builder.create();
dialog.show();
PROBLEM:
Initially, I'm passing an Array to setMultiChoiceItems method and it works fine but how to pass an ArrayList instead of an array? Like this:
ArrayList<Products> brandList = new ArrayList<>();
Whenever I'm trying to pass an ArrayList to setMultiChoiceItems method it gives me this error:
Cannot resolve method 'setMultiChoiceItems(java.util.ArrayList<com.application.marketvisit.dataItem.Products>, null, anonymous android.content.DialogInterface.OnMultiChoiceClickListener)'
You need to pass a String array to AlertDialog.Builder#setMultiChoiceItemsso collect it as a String array
String arr = new String[brandList.size()];
for(int i=0 ; i< brandList.size();i++){
arr[i] = brandList.get(i).getProductName();
//getProductName or any suitable method
}
Try this...and let me know if it works..
ArrayList<String> strBrandList = new ArrayList<String>();
for (int i = 0; i < brandList.size(); i++) {
strBrandList.add(brandList.get(i).getProductName())
}

cannot resolve method 'getwindow()' in Activity

am trying to add this this line in my Activity builder.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
but I find find this error Cannot resolve method'getwindow'
as am trying to add my code like this
NewGuestCheck.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(TabsActivity.this);
builder.setTitle("Insert Table Name");
// Set up the input
final EditText input = new EditText(TabsActivity.this);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(input, InputMethodManager.SHOW_IMPLICIT);
// Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_CLASS_TEXT);
builder.setView(input);
// Set up the buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
final String Table_Name = input.getText().toString();
AlertDialog.Builder builder = new AlertDialog.Builder(TabsActivity.this);
builder.setTitle("Insert number of Covers");
// Set up the input
final EditText input2 = new EditText(TabsActivity.this);
// Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
input.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_CLASS_NUMBER);
builder.setView(input2);
// Set up the buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
String Cover_check = input2.getText().toString();
TablesFragment.Check_Items = ConnectionClass.Ret_dt("Select * From ChecksItems Where Check_ID = 0");
if (!TablesFragment.Check_Items.containsKey("Change_Temp")) {
if (TablesFragment.Check_Items.size() > 0) {
ArrayList<Object> Valrows = new ArrayList<Object>();
if (TablesFragment.Check_Items.get("Item_ID").size() > 0) {
for (int i = 0; i < TablesFragment.Check_Items.get("Item_ID").size(); i++) {
Valrows.add("");
}
}
TablesFragment.Check_Items.put("Change_Temp", Valrows);
}
}
if (Integer.parseInt(Cover_check) > 0) {
String st = ConnectionClass.Ret_Col("Select Max (CheckSerail) AS Ser From Checks_V where Officer = 0 AND OutLet_ID = " + ConnectionClass.OutletID + " And Rest_ID_Active = " + ConnectionClass.Rest_ID);
if (st.trim() == "")
st = "0";
int Check_Serial = Integer.parseInt(st) + 1;
long Check_ID = Long.parseLong(ConnectionClass.SelectNewIDCheck());
st = "insert into Checks .......
}
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
builder.show();
as I need from this method that when the alert dialog start the keyboard starts automatically that I don't need to touch the edit text to show the key board
sorry if any thing is not clear and sorry for my bad english
I hope this case could be solved
by the way activity looks
public class TabsActivity extends AppCompatActivity {
There is a similar question on StackOverflow. You need to call getWindow() on the Dialog Class.
call getWindow() by giving any views reference.ex
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

How can I display values of arraylist in toast?

I'm displaying checkboxes in alertdialog. When user clicks OK, toast should come up like You've selected PHP, Java, JSON. Right now, its displaying IDs. How can I get values?
Dialog dialog;
final String[] items = {" Objective C", " JAVA", " JSON", " C#", "PHP"};
final ArrayList itemsSelected = new ArrayList();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select Languages you know : ");
builder.setMultiChoiceItems(items, null,
new DialogInterface.OnMultiChoiceClickListener() {
#Override
public void onClick(DialogInterface dialog, int selectedItemId,
boolean isSelected) {
if (isSelected) {
itemsSelected.add(selectedItemId);
} else if (itemsSelected.contains(selectedItemId)) {
itemsSelected.remove(Integer.valueOf(selectedItemId));
}
}
})
.setPositiveButton("Done!", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
//Your logic when OK button is clicked
Toast.makeText(MainActivity.this,"You've selected "+itemsSelected,Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
}
});
dialog = builder.create();
dialog.show();
[UPDATE] I found solution but it doesn't seem ideal. For now its working by adding following code.
String one="";
String two="";
String three="";
String four="";
String zero="";
if (s.contains("0" ))
{
zero="Obj C ";
}
if (s.contains("1"))
{
one="JAVA ";
} if (s.contains("2"))
{
two="JSON ";
} if (s.contains("3"))
{
three="C# ";
} if (s.contains("4"))
{
four="PHP ";
}
This part of your code
new DialogInterface.OnMultiChoiceClickListener() {
#Override
public void onClick(DialogInterface dialog, int selectedItemId,
boolean isSelected) {
if (isSelected) {
**itemsSelected.add(selectedItemId);**
} else if (itemsSelected.contains(selectedItemId)) {
itemsSelected.add(selectedItemId) simply adds the id to your arraylist. You do not want the id added. Since you want the exact values added, You can simply use something like itemsSelected.add(items[selectedItemId]) since the items array contains what values you need to display. When you have put your correct values in your arraylist, then you display your toast maybe using itemsSelected.toString() or something. You also need to handle all the other checks.

setMultiChoiceItems and my array

In my code I can choose checkbox items and set their in my array:
protected ArrayList<Integer> selectedStatusId = new ArrayList<>();
But when I choose same checkbox item, need delet it from my array and... I cna't do it, becouse id in my array differs of my mStatuses.
How can I delete my desired item?
Maybe can I get all selected items after click positive button?
final ArrayList<String> statusesTitles = new ArrayList<>();
for (int i = 0; i < mStatuses.size(); i++) {
statusesTitles.add(mStatuses.get(i).StatusTitle);
}
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.order_dialog_status_title)
.setMultiChoiceItems(statusesTitles.toArray(new String[statusesTitles.size()]), null, new DialogInterface.OnMultiChoiceClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
if (b){
selectedStatusId.add(mStatuses.get(i).StatusId);
} else {
// TODO How I can delete my position from array?
}
}
})
.setPositiveButton(R.string.order_dialog_status_positive_button, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
refreshContent();
}
})
.setNegativeButton(R.string.order_dialog_status_negative_button, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});
builder.show();
You can remove item by the following method.
ArrayList<Integer> selectedStatusId = new ArrayList<>();
if (true){
selectedStatusId.add(mStatuses.get(i).StatusId);
} else {
// delete the first occurrence of the specified element from array
selectedStatusId.remove(new Integer(mStatuses.get(i).StatusId));
}
final ArrayList<String> selectedStatusId = new ArrayList<>();
//MAKE IT STRING TYPE
final ArrayList<String> statusesTitles = new ArrayList<>();
for (int i = 0; i < mStatuses.size(); i++) {
statusesTitles.add(mStatuses.get(i).StatusTitle);
}
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.order_dialog_status_title)
.setMultiChoiceItems(statusesTitles.toArray(new String[statusesTitles.size()]), null, new DialogInterface.OnMultiChoiceClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
if (b) {
selectedStatusId.add(String.valueOf(mStatuses.get(i).StatusId));
} else {
// TODO How I can delete my position from array?
selectedStatusId.remove(String.valueOf(mStatuses.get(i).StatusId));
}
//OR_______________________YOU CAN USE THIS ALSO
// if (selectedStatusId.contains(String.valueOf(mStatuses.get(i).StatusId))) {
// selectedStatusId.remove(String.valueOf(mStatuses.get(i).StatusId));
// } else {
// selectedStatusId.add(String.valueOf(mStatuses.get(i).StatusId));
// }
}
})
.setPositiveButton(R.string.order_dialog_status_positive_button, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
refreshContent();
}
})
.setNegativeButton(R.string.order_dialog_status_negative_button, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});
builder.show();
Hope this helps..

android: calling redraw of dialog from within onCreateDialog

i've placed a button on my dialog layout that i would like to trigger a complete redraw of the Dialog. However, it appears you can't open dialogs from within onCreateDialog, and i can't find a way to dismiss dialogs without using setPositiveButton and the like, as it's the only Button override that gives the dialog as a parameter (and i can't find a way to get it for a Button that's part of the layout). here's all the relevant code:
case DIALOG_WIFI_PREF:
{
Dialog dialog = new Dialog(this);
final View dialogLayout = inflater.inflate(R.layout.dialog_wifi_pref, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(dialogLayout);
builder.setTitle("IP Configuration");
final EditText ipIn = (EditText)dialogLayout.findViewById(R.id.wifi_ip_in);
final EditText portIn = (EditText)dialogLayout.findViewById(R.id.wifi_port_in);
final EditText labelIn = (EditText)dialogLayout.findViewById(R.id.site_label_in);
final EditText codeIn = (EditText)dialogLayout.findViewById(R.id.activation_code);
final Spinner siteSpn = (Spinner)dialogLayout.findViewById(R.id.site_spn);
final Button deleteBtn = (Button)dialogLayout.findViewById(R.id.delete_btn);
final Cursor cur = mDb.rawQuery("SELECT * FROM " + DbSchema.SiteSchema.TABLE_NAME, null);
cur.moveToFirst();
final SimpleCursorAdapter tempAdapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_spinner_item,
cur,
new String[] { DbSchema.SiteSchema.COLUMN_LABEL },
new int[] { android.R.id.text1 }
);
tempAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
siteSpn.setAdapter(tempAdapter);
//fill the initial values
String initSite = pref.getString("site_id", "New Site");
String spnLabel = null;
final Cursor initCur = mDb.query(DbSchema.SiteSchema.TABLE_NAME, null, DbSchema.SiteSchema.COLUMN_LABEL + "=?", new String[] { initSite }, null, null, null);
initCur.moveToFirst();
cur.moveToFirst();
if(initCur.getCount()>0) {
ipIn.setText(initCur.getString(initCur.getColumnIndex(DbSchema.SiteSchema.COLUMN_IP)));
portIn.setText(initCur.getString(initCur.getColumnIndex(DbSchema.SiteSchema.COLUMN_PORT)));
codeIn.setText(initCur.getString(initCur.getColumnIndex(DbSchema.SiteSchema.COLUMN_ACTIVATION_CODE)));
spnLabel = initCur.getString(initCur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL));
labelIn.setText(spnLabel);
if(cur.getCount()>0) {
do {
if(spnLabel.equals(cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL)))) {
siteSpn.setSelection(cur.getPosition());
}
} while(cur.moveToNext());
}
}
siteSpn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
cur.moveToFirst();
if(cur.getCount()>0) {
do {
String tempLabel = cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL));
if(tempLabel.equals(((TextView)view.findViewById(android.R.id.text1)).getText().toString())) {
labelIn.setText(tempLabel);
portIn.setText(cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_PORT)));
ipIn.setText(cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_IP)));
codeIn.setText(cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_ACTIVATION_CODE)));
}
} while(cur.moveToNext());
}
}
public void onNothingSelected(AdapterView<?> parent) {
//
}
});
deleteBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//do things
cur.moveToFirst();
while(cur.moveToNext()) {
String tempLabel = cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL));
View selectedSiteView = siteSpn.getSelectedView();
String label = ((TextView)selectedSiteView.findViewById(android.R.id.text1)).getText().toString();
if(tempLabel.equals(label)) {
mDb.delete(DbSchema.SiteSchema.TABLE_NAME, DbSchema.SiteSchema.COLUMN_LABEL+"=?", new String[] { label });
//dialogLayout.invalidate();
//dialog.dismiss();
//dialog.invalidate();
//v.getParent().invalidate();
}
}
}
});
builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
cur.moveToFirst();
boolean newRecord = true;
do {
String tempLabel = null;
if(cur.getCount()>0) {
tempLabel = cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL));
}
if(tempLabel!=null && tempLabel.equals(labelIn.getText().toString())) {
//update
ContentValues cv = new ContentValues();
cv.put(DbSchema.SiteSchema.COLUMN_IP, ipIn.getText().toString());
cv.put(DbSchema.SiteSchema.COLUMN_PORT, portIn.getText().toString());
cv.put(DbSchema.SiteSchema.COLUMN_ACTIVATION_CODE, codeIn.getText().toString());
MobileDashboardActivity.this.mDb.update(DbSchema.SiteSchema.TABLE_NAME, cv, DbSchema.SiteSchema.COLUMN_LABEL+"=?", new String[] { tempLabel });
newRecord = false;
break;
}
} while(cur.moveToNext());
if(newRecord) {
//new entry
ContentValues cv = new ContentValues();
cv.put(DbSchema.SiteSchema.COLUMN_IP, ipIn.getText().toString());
cv.put(DbSchema.SiteSchema.COLUMN_PORT, portIn.getText().toString());
cv.put(DbSchema.SiteSchema.COLUMN_LABEL, labelIn.getText().toString());
cv.put(DbSchema.SiteSchema.COLUMN_ACTIVATION_CODE, codeIn.getText().toString());
MobileDashboardActivity.this.mDb.insert(DbSchema.SiteSchema.TABLE_NAME, null, cv);
}
SharedPreferences.Editor editor = pref.edit();
editor.putString("site_id", labelIn.getText().toString());
editor.putString("activation", codeIn.getText().toString());
editor.commit();
MobileDashboardActivity.this.writeCSVFile("dashboard_settings.csv");
dialog.dismiss();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
dialog = builder.create();
return dialog;
}
i ended up following this example:
http://developmentality.wordpress.com/2009/10/31/android-dialog-box-tutorial/
which uses the Command pattern to proc outer logic:
http://en.wikipedia.org/wiki/Command_pattern
and here are the files:
Command.java:
package com.conceptualsystems.dialog;
[...import statements...]
public interface Command {
public void execute();
public static final Command NO_OP = new Command() { public void execute() {} };
}
CommandWrapper.java:
package com.conceptualsystems.dialog;
[...import statements...]
public class CommandWrapper implements DialogInterface.OnClickListener {
private Command command;
public CommandWrapper(Command command) {
this.command = command;
}
public void execute() {
command.execute();
}
#Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
command.execute();
}
}
relevant code from MainActivity.java (member variable definition):
Command delete = new Command() {
public void execute() {
removeDialog(DIALOG_WIFI_PREF);
showDialog(DIALOG_WIFI_PREF);
}
};
dialog code utilizing Command class and CommandWrapper:
builder.setNeutralButton("Delete", new CommandWrapper(delete) {
public void onClick(DialogInterface dialog, int which) {
//do things
cur.moveToFirst();
while(cur.moveToNext()) {
String tempLabel = cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL));
View selectedSiteView = siteSpn.getSelectedView();
String label = ((TextView)selectedSiteView.findViewById(android.R.id.text1)).getText().toString();
if(tempLabel.equals(label)) {
mDb.delete(DbSchema.SiteSchema.TABLE_NAME, DbSchema.SiteSchema.COLUMN_LABEL+"=?", new String[] { label });
}
}
dialog.dismiss();
this.execute();
}
});

Categories