Передать действие кнопке - PullRequest
1 голос
/ 30 ноября 2011

Мне нужно передать Намерение в onClickListener в Android ... Но немного по-другому, чем обычно.

У меня есть gridView кнопок, и при каждом первом нажатии на каждую кнопку он говорит только о том, какое действие выполняет эта кнопка (для слепых), и мне нужно, чтобы Intent было запущено, пока пользователь дважды нажимает на одну и ту же кнопку дважды. У меня есть этот адаптер

public class BlindAdapter extends BaseAdapter implements OnClickListener{
    private Context mContext;
    private String[] labels;
    private Button currentlyClicked;

    public BlindAdapter(Context c, String[] labels) {/*Empty*/}

    @Override
    public int getCount() {/*Empty*/}

    @Override
    public Object getItem(int arg0) {/*Empty*/}

    @Override
    public long getItemId(int arg0) {/*Empty*/}

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {/*Empty*/}

    private void say(String text) {/*Empty*/}

    @Override
    public void onClick(View view) {
        Button btn = (Button) view;
        Log.v("id", ""+view.hashCode());
        if(this.currentlyClicked == null || this.currentlyClicked.hashCode() != view.hashCode()){
            if(this.currentlyClicked != null) this.currentlyClicked.setBackgroundColor(Color.LTGRAY);
            this.currentlyClicked = (Button) view;

            btn.setBackgroundColor(Color.GRAY);
            this.say(btn.getText().toString());
        } else{
            this.say("Zvolena volba:" + btn.getText().toString());
            btn.setBackgroundColor(Color.LTGRAY);
            this.currentlyClicked = null;
        }
    }

    //Notice I posted inly onCLick method with its body for simplicity..

И я это создаю, вот так

gridview.setAdapter(
    new BlindAdapter(this.getApplicationContext(),
    new String[]{"jedna", "dva", "tri", "ctyri", "pet", "šest", "osm"})
);

Строки - это действия, которые являются красными для пользователя. Так что мне нужно передать туда даже Намерение для каждой конкретной кнопки. Можно ли передать его туда как другой параметр?

Или можно как-нибудь переопределить событие onclick кнопки в моей Активности и сначала вызвать super.OnClick, где приложение решит, будет его первый или второй щелчок, и в соответствии с возвратом я остановлю все событие onclick, или продолжу вернуться к главному событию в Activity и вызвать Intent?

Или есть лучший способ добиться всего этого? (Я думаю, что по крайней мере первая возможность, о которой я подумал, действительно странная).

EDIT

А как насчет того, чтобы сделать каждый элемент "фокусируемым" ... Это было бы гораздо более доступно (трекболы и т. Д.). Возможно сделать gridViewItem только выделенным в первый клик (просто сфокусироваться) и кликнуть только при следующем клике .. (Это поведение, которого я пытаюсь достичь) ..

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Я не уверен, что правильно понимаю проблему, но, поскольку ваш вариант использования довольно специфичен, и вам, вероятно, он понадобится снова в вашем приложении, я хотел бы создать пользовательскую кнопку и использовать ее в своем макете вместородной.Для строки, которую нужно прочитать, я бы использовал атрибут tag, а не текст, но это не имеет большого значения в коде.

public class BlindButton extends Button {
    private boolean firstTime = true;
    private Intent intent;

    [...]

    public BlindButton(Context context, AttributeSet attrs) {
        [...]
        setOnClickListener(new OnClickListener() {
            @Override
            public void onClick() {
                if (firstTime) {
                    firstTime = false;
                    say(getText());    // or getTag()
                } else {
                    if (intent != null) {
                        getContext().startActivity(intent);
                    }
                }
            }
        });
    }

    private void setIntent(Intent intent) {
        this.intent = intent;
    }
    private void say(String text) {
        [...]
    }
}

Для цели, я думаю, это зависит от того, какое действие вы хотите инициировать.Я думаю, что вышеприведенный setIntent может сработать, хотя он мне не очень нравится, но без дополнительной информации я не могу придумать более элегантного решения.В основном, при использовании BlindButton в ваших адаптерах, вам не нужно будет писать какой-либо дополнительный код (например, setOnClickListener или что-то еще), а вместо этого просто вызывать для них setIntent.

0 голосов
/ 01 декабря 2011

Я полностью переосмыслил и понял, что использование GridView в этом случае плохо. Я делаю это снова, используя TableLayout и определяя его через XML ... Затем я могу создать собственный onDoubleClickListener, который будет добавлен прямо в Activity... Этот GridView я сохраню только для специальных целей, таких как отображение элементов из базы данных и ответов от сервера, но не для пользовательского интерфейса вообще (для стандартных кнопок действий) Разве это не лучшее решение?

...