Boanta Ionut
Boanta Ionut

Reputation: 402

AlertDialog Builder OnItemSelectedListener

I have a tyny, but annoying problem with the AlertDialog Builder. I want to handle an item select in a custom made AlertDialog, but OnItemSelectedListener doesn't seem to pick my clicks.

Custom Dialog:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="120dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="60dp"
android:background="#AAFFFFFF"
android:orientation="vertical">


<TextView
    android:text="English"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:id="@+id/lang_english"
    android:gravity="center_vertical"
    android:background="@color/borders"
    android:paddingLeft="10dp"
    android:onClick="onLanguageButtonClicked" />
<View
    android:layout_height="1dp"
    android:layout_width="match_parent"
    android:background="#000000" />

<TextView
    android:text="عربى"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:id="@+id/lang_arabic"
    android:gravity="center_vertical"
    android:background="@color/borders"
    android:paddingRight="10dp"
    android:onClick="onLanguageButtonClicked" />

<View
    android:layout_height="1dp"
    android:layout_width="match_parent"
    android:background="#2e2e2e"/>

<TextView
    android:text="کوردی "
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:id="@+id/lang_kurdish"
    android:gravity="center_vertical"
    android:background="@color/borders"
    android:paddingRight="10dp"
    android:onClick="onLanguageButtonClicked" />

</LinearLayout>

On button click I open the dialog and handle it:

public void onClickDrawer(View view) {
    switch (view.getId()) {
        case R.id.button_account_language:
            handleLanguageDialog();
            break;
        case R.id.button_account_currency:
            handleCurrencyDialog();
            break;
        default:
            break;
    }
}

And the handler:

private void handleLanguageDialog() {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setView(R.layout.dialog_language);
    builder.setOnItemSelectedListener(new      AdapterView.
    OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, 
        int position, long id) {
            SharedPreferences preferences =  PreferenceManager
            .getDefaultSharedPreferences(getApplicationContext());
            Log.i("info", "pressed" + Integer.toString(position));
            restartInLocale(new Locale(preferences.getString("locale","")));
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });
    builder.setNegativeButton("CANCEL", new   DialogInterface
    .OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

        }
        });
    builder.create().show();
}

Is this the correct approach or am I missing something?

Thank you in advance!

Upvotes: 3

Views: 2386

Answers (5)

sodhankit
sodhankit

Reputation: 1248

I don't this is correct Approach, you are making it very much complex. If I am not wrong then you are trying to show Language selection dialog for that you should follow the below given steps.

  1. Create string-array inside strings.xml resource file

    <string-array name="lang">
        <item>English</item>
        <item>عربى</item>
    </string-array>
    
  2. When you want to show alert dialog write down below code

    private void handleLanguageDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(R.string.pick_color)
       .setItems(R.array.lang, new DialogInterface.OnClickListener()                 {
           public void onClick(DialogInterface dialog, int which) {
           // The 'which' argument contains the index position
           // of the selected item
           switch(which)
           {
              case 0:// English
                  break;
              case 1:// عربى
                  break;
           }
       }
    });
    return builder.create();
    }
    

This is the simplest way to show list of languages in alert dialog and without any positive or negative button .

Upvotes: 4

rafsanahmad007
rafsanahmad007

Reputation: 23881

Try this: add click listener to the language item in your Dialog

onItemSelected() is applied for listview or spinner items your Dialog layout dialog_language does not have those.

Try this code:

 AlertDialog.Builder builder = new AlertDialog.Builder(this);
                // Get the layout inflater
                LayoutInflater inflater =getLayoutInflater();
                View myview = inflater.inflate(R.layout.dialog_language, null);
                // Inflate and set the layout for the dialog
                builder.setView(myview);

                TextView english = (TextView) myview.findViewById (R.id.lang_english);
                english.setOnClickListener(new View.OnClickListener() {

                    public void onClick(View v) {
                        //do some stuff
                         SharedPreferences preferences =  PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                        Log.i("info", "pressed" + Integer.toString(position));
                        restartInLocale(new Locale(preferences.getString("locale","")));
                        }
                });

                TextView arabic = (TextView) myview.findViewById (R.id.lang_arabic);
                arabic.setOnClickListener(new View.OnClickListener() {

                    public void onClick(View v) {
                       //do other stuff
                    }
                });


                // Add action buttons
                       builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int id) {
                               dialog.cancel();
                           }
                       });
                   builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int id) {
                           dialog.cancel();
                       }
                   });   

            builder.show();

Upvotes: 1

B.shruti
B.shruti

Reputation: 1630

Try to use setOnItemClick listener on the list/spinner view whichever you are using to display the list instead of builder itself. Like if you are using spinner to show the list use-

final Spinner spinner = (Spinner) layout.findViewById(R.id.spinner);                                                                       spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3){
            int item = spinner.getSelectedItemPosition();
            commandWriter(item); 
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }
    });

Upvotes: 1

sadat
sadat

Reputation: 4352

private void handleLanguageDialog() {
    ArrayList<String> listItems = new ArrayList<>();
    listItems.add("English");
    listItems.add("Arabic");
    new AlertDialog.Builder(this)
            .setTitle("title")
            .setCancelable(false)
            .setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int item) {

                        }
                    }).setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {
            // sign in the user ...
        }
    }).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {

        }
    }).show();
}

Upvotes: 1

Michael Vescovo
Michael Vescovo

Reputation: 3931

It looks a bit off. It should look like this:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(inflater.inflate(R.layout.dialog_signin, null))
        // Add action buttons
       .setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int id) {
               // sign in the user ...
           }
       })
       .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               LoginDialogFragment.this.getDialog().cancel();
           }
       });
    return builder.create();
}

https://developer.android.com/guide/topics/ui/dialogs.html

Upvotes: 1

Related Questions