метод onClick для программно созданных кнопок - PullRequest
1 голос
/ 18 августа 2011

Я создал массив из 5 интерактивных текстовых представлений, используя цикл, установил их параметры (размер, цвет, фоновое изображение, кликабельность и т. Д.) И установил onClickListener, а массив называется «myArrayofTVs».Их идентификаторы были установлены с помощью цикла int (i).У меня есть другой предопределенный массив, который содержит текстовую строку, и другие текстовые представления присутствуют на макете.Позже в методе onClick, и поскольку все кнопки / интерактивные текстовые представления делают что-то очень похожее, я хотел бы иметь возможность сделать что-то вроде:

@Override
public void onClick(View v) { 

if(v == myArrayofTVs[i]) {               //using 'i' here doesn't seem to work
tv1.setText(myArray2[i]);
tv2.setText(myArray2[i+1];}
etc
etc}

Я пробовал различные способы, такие какиспользование операторов переключения регистра (на самом деле не хочу их использовать, так как будет много повторяющегося кода, и мне придется добавлять новую инструкцию регистра каждый раз, когда я хочу добавить новые текстовые представления / кнопки в будущем).В любом случае можно ли использовать один оператор, который будет обрабатывать все кнопки / интерактивные текстовые представления на основе заданной переменной id, или мне придется использовать отдельный оператор case / tag / id для каждого из них?

Большое спасибо заранее!

Ответы [ 3 ]

0 голосов
/ 18 августа 2011

Я действительно думаю, что вы должны использовать идентификатор, предоставленный Android, вместо того, чтобы пытаться сравнивать объекты.Причина, по которой ваш код не сработал бы, если бы вокруг него было достаточно цикла for, несколько загадочна, но я бы постарался как можно больше распараллелить операторы switch, которые вы видите в примерах, сравнивая ID, а не объекты.

for( int i = 0; i < myArrayofTvs.length; i++ )
    if(v.getId() == myArrayofTVs[i].getId()) {               
        tv1.setText(myArray2[i]); 
        tv2.setText(myArray2[i+1];
    }
}

Также очевидно, что вы захотите избежать ошибки массива вне границ во втором внутреннем операторе.

0 голосов
/ 18 августа 2011

То, что я сделал, было программно надуть мою пользовательскую компоновку и использовал onClickListener для этой кнопки из раздутой пользовательской компоновки. Затем, чтобы взаимодействовать с конкретным элементом, я получил родительское представление, например, по нажатию. ваша кнопка, а затем использовал это представление, чтобы изменить атрибуты представления. Это фрагмент моего кода. OnClick в alertDialog - это то место, где я изменяю значения нового завышенного представления.

            // if an edit button of numbers row is clicked that number will be edited
        if (view.getId() == R.id.NumberRowEditButton)
        {
            AlertDialog.Builder alert = new AlertDialog.Builder(this);

            alert.setTitle("Contact edit");
            alert.setMessage("Edit Number");

            // Set an EditText view to get user input
            final EditText input = new EditText(this);

            input.setSingleLine();
            alert.setView(input);

            alert.setPositiveButton("Ok", new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialog, int whichButton)
                {
                    // get input
                    Editable value = input.getText();
                    if(value.length() > 4){

                        View tempView = (View) view.getParent();
                        TextView tempTV = (TextView) tempView.findViewById(R.id.numberRowTextView);
                        String number = tempTV.getText().toString();

                        tempTV.setText(value.toString());
                    }
                    else
                    {
                        // ...warn user to make number longer
                        final Toast msgs = Toast.makeText(ContactEdit.this, "Number must be over 4 digits.", Toast.LENGTH_SHORT);
                        msgs.setGravity(Gravity.CENTER, msgs.getXOffset() / 2, msgs.getYOffset() / 2);
                        msgs.show();
                    }
                }
            });

            alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialog, int whichButton)
                {
                    // cancel the dialog
                    dialog.cancel();
                }
            });

            alert.show();
        }

Надеюсь, это поможет вам.

0 голосов
/ 18 августа 2011

Добавьте представления в вашу ViewGroup и используйте getChildAt (int index) и getChildCount () для создания цикла. Вы можете зациклить все дочерние элементы / представления в группе просмотра, и вы можете проверить с помощью

if(child instanceof TextView)

, если они имеют правильный тип. Затем вы можете преобразовать представления обратно в TextView / Button / View и сделать то, что вы хотите.

Но звучит так, будто ты хочешь список чего-то. Поэтому я бы предложил использовать ListView с адаптером позади него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...