1

スピナーアイテムが変更されたときに警告メッセージを作成することは可能ですか?ただし、ユーザーが[選択なし]をクリックした場合は、選択をキャンセルして、選択したアイテムを以前の状態のままにする必要があります。最後に選択したスピナーアイテムを保存し、ユーザーが[いいえ]を選択したときにそれをスピナーに渡すと、不要なonItemSelectedListenerがティルガーになります。

OnTouchListenerを使用しようとしましたが、スピナーに触れた直後にスピナーリストが表示されるため、これは役に立ちません。

理解を深めるために、以下の私のコードを参照してください。

    spinnerSearch.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, final int position, long id) {

            if (!ShoppingCart.isEmpty()) {
                AlertDialog.Builder dialog = new AlertDialog.Builder(SearchProductActivity.this);
                dialog.setMessage("Selecting new finacier will empty your basket.").setCancelable(false).setPositiveButton("Yes", new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        //do some work
                        //storing lastSelectedFinancier
                    }

                }).setNegativeButton("No", new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {

                        dialog.dismiss();
                        //cancel selection
                        //spinnerSearch.setSelection(lastSelectedFinancier)

                    }

                });

                AlertDialog alert = dialog.show();

                TextView messageView = (TextView) alert.findViewById(android.R.id.message);
                messageView.setGravity(Gravity.CENTER);
            } else {
                //do some other work
                //lastSelectedFinancier
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }

        //lastSelectedFinancier

    });

4

2 に答える 2

1

チェックボックスについても同じ問題がありました。ユーザー入力をリッスンするようにonCheckedChangeListenerを設定してから、設定またはアラートダイアログからチェックボックスを更新します。これにより、再びonCheckedChangeListenerがトリガーされます:)これが回避策です。

1) "spinnerSearch.setOnItemSelectedListener(new OnItemSelectedListener(){..."の代わりに、グローバル宣言を使用して新しいOnItemSelectedListenerオブジェクトを作成します。これをmyClickListenerと呼びます。

2)このオブジェクトの本体内で、アラートダイアログを作成するときに、[いいえ]ボタン宣言内で、コードを少し変更してリスナーをnullに設定し、次にスピナー値を変更してから、リスナーをmyClickListenerに設定します。また。

このようにコードを変更してみて、それが機能するかどうかを知らせてください。

    private OnItemClickListener myClickListener = new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, final int position, long id) {

            if (!ShoppingCart.isEmpty()) {
                AlertDialog.Builder dialog = new AlertDialog.Builder(SearchProductActivity.this);
                dialog.setMessage("Selecting new finacier will empty your basket.").setCancelable(false).setPositiveButton("Yes", new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        //do some work
                        //storing lastSelectedFinancier
                    }

                }).setNegativeButton("No", new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                //Modified code:
                        spinnerSearch.setOnItemSelectedListener(null) //Disable the onItemClickListener
                        spinnerSearch.setSelection(lastSelectedFinancier) //Cancel selection, while the OnClickListener is disabled
                        spinnerSearch.setOnItemSelectedListener(myClickListener) //Enable onItemClickListener
                        dialog.dismiss();
                    }

                });

                AlertDialog alert = dialog.show();

                TextView messageView = (TextView) alert.findViewById(android.R.id.message);
                messageView.setGravity(Gravity.CENTER);
            } else {
                //do some other work
                //lastSelectedFinancier
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }

        //lastSelectedFinancier

    }); //End of myClickListener declaration


    //This goes into your code:
    spinnerSearch.setOnItemSelectedListener(myClickListener)

于 2012-11-10T22:10:18.713 に答える
0

この問題の回避策を見つけました。スピナーの代わりに、テキストボックス(ウィットスピナースタイル)を使用し、それをアラートダイアログと組み合わせてリストを作成しました。多分それは最善の解決策ではありませんが、それは私にとってはうまくいきました:)))

public class SpinnerItem {

String spinnerText;
String value;

public SpinnerItem(String text, String value) {
    this.spinnerText = text;
    this.value = value;
}

public String getSpinnerText() {
    return spinnerText;
}

public String getValue() {
    return value;
}

public String toString() {
    return spinnerText;
}

public class SearchProductActivity extends BaseActivity {

private EditText txtSearch;
private ListView listProducts;
private Button btnShoppingCart;
private EditText txtSelectFinancier;
private DevRestHelper rest;
private ListOfProducts adapter;
public static String financierRelationNumber;
private int numberOfItemsInBasket = 0;

private List<ProductModel> products = new ArrayList<ProductModel>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_product);

    initControls();
    getProjectSupplier();
    financierRelationNumber = String.valueOf(OrderData.Financiers.get(0).RelationNumber);
    txtSelectFinancier.setText(String.valueOf(OrderData.Financiers.get(0).Name));
    GetProducts(financierRelationNumber);
    setButtonActions();
    ShoppingCart.ProductOwnerId = getProjectSupplier().get(0).getValue();
    ShoppingCart.ProductOwner = getProjectSupplier().get(0).getSpinnerText();

}

    private void initControls() {
    btnShoppingCart = (Button) findViewById(R.id.activity_search_product_btnShoppingCart);
    listProducts = (ListView) findViewById(R.id.activity_search_product_listProducts);
    txtSearch = (EditText) findViewById(R.id.activity_search_product_txtName);
    txtSelectFinancier = (EditText) findViewById(R.id.activity_search_product_txtFinancier);

}

private void setButtonActions() {

    txtSelectFinancier.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if (!ShoppingCart.isEmpty()) {
                AlertDialog.Builder dialog = new AlertDialog.Builder(SearchProductActivity.this);
                dialog.setMessage(getString(R.string.err_selecting_new_finacier_will_empty_your_basket)).setCancelable(false).setPositiveButton("Yes", new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                        listDialog(SearchProductActivity.this, "", getProjectSupplier(), txtSelectFinancier);
                        listProducts.setAdapter(null);
                        ShoppingCart.emptyCartItems();
                        ShoppingCart.ProductOwner = txtSelectFinancier.getText().toString();

                    }
                }).setNegativeButton("No", new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {

                        dialog.dismiss();
                    }

                });

                AlertDialog alert = dialog.show();

                TextView messageView = (TextView) alert.findViewById(android.R.id.message);
                messageView.setGravity(Gravity.CENTER);

            } else
                listDialog(SearchProductActivity.this, "", getProjectSupplier(), txtSelectFinancier);
        }
    });

}

    private List<SpinnerItem> getProjectSupplier() {

    List<SpinnerItem> items = new ArrayList<SpinnerItem>();

    for (DetermineFinanciersModel finaciers : OrderData.Financiers) {
        items.add(new SpinnerItem(finaciers.Name, String.valueOf(finaciers.RelationNumber)));
    }

    return items;

}

private void listDialog(Context context, String title, final List<SpinnerItem> list, final TextView control) {

    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setTitle(title);

    List<String> strings = new ArrayList<String>();

    for (SpinnerItem spinnerItem : list) {
        strings.add(spinnerItem.getSpinnerText());
    }

    final CharSequence[] items = strings.toArray(new String[strings.size()]);

    builder.setItems(items, new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int selectedItem) {
            control.setText(list.get(selectedItem).getSpinnerText());
            ShoppingCart.ProductOwnerId = list.get(selectedItem).getValue();
            GetProducts(list.get(selectedItem).getValue());
        }
    });

    AlertDialog alert = builder.create();
    alert.show();

}

}

于 2012-11-16T14:20:57.653 に答える