Удаление Table Row через контекстное меню

Интерфейс, диалоги, темы, стили, меню
Ответить
mrstuff88
Сообщения: 9
Зарегистрирован: 13 янв 2016, 23:58

Удаление Table Row через контекстное меню

Сообщение mrstuff88 » 04 фев 2016, 06:56

Здравствуйте. Хочу сделать, чтобы по нажатию на Table Row появлялось Context Menu с подтверждением об удалении данной row. Table Row`s создаются программно и XML файл отсутствует, так что findviewbyId использовать не получается. Вот код создания Table Row:

Код: Выделить всё

   int nameColumn= tableCursor.getColumnIndex("someColumn");
            String reserveName = tableCursor.getString(nameSome);
            final TableLayout tl = (TableLayout) findViewById(R.id.mainLayout);
           TableRow tr = new TableRow(this);
            registerForContextMenu(tl);

            tl.setStretchAllColumns(true);
            tl.setShrinkAllColumns(true);
            tr.setGravity(Gravity.CENTER);
            tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));

            TextView textview = new TextView(this);
            textview.setText(reserveName);
            textview.setTextColor(Color.BLACK);
            textview.setTextSize(20);
            textview.setGravity(Gravity.START);
            tr.addView(textview);
Далее, создал контекстное меню, которое реагирует на нажатие и может выводить ЛОГ.

Код: Выделить всё

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenu.ContextMenuInfo menuInfo) {
    if (v.getId()==R.id.mainLayout) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
        menu.setHeaderTitle("Delete row?");

        menu.add(0, 0, 0, "Yes");

    }
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    if (item.getItemId() == 0) {
        Log.d(LOG_TAG, "ПРОВЕРКА!");



        return true;
    }
    return super.onContextItemSelected(item);
}
Но никак не получается получить(извиняюсь за тавтологию) значения нажатой Table Row. В этом месте студия банально не видит Table Row`s. Подскажите, как можно это реализовать?
P.S. пробовал удалять через onLongClick - прекрасно работает, но метод onLongClick находится непосредственно в месте, где создаются Table Row`s, поэтому и работает. Надеюсь на Вашу помощь :!:
UPP Вот решение, может кому пригодится

Код: Выделить всё

tr.setOnLongClickListener(new View.OnLongClickListener()
            {
                @Override
                public boolean onLongClick(final View v)
                {

                    TableRow t = (TableRow) v;
                    TextView firstTextView = (TextView) t.getChildAt(0);
                    final String firstText = firstTextView.getText().toString();


                    PopupMenu popup = new PopupMenu(MainActivity.this, v);
                    MenuInflater inflater = popup.getMenuInflater();
                    inflater.inflate(R.menu.popup_menu, popup.getMenu());

                    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener()
                    {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {

                            switch (item.getItemId()) {

                                case R.id.menu1:
                                    Log.d(LOG_TAG, firstText);
                                    tl.removeView(v);

                                    return true;

                                default:
                                    return false;
                            }
                        }
                    });


                    popup.show();
                    return true;
                }

            });
Последний раз редактировалось mrstuff88 05 фев 2016, 18:49, всего редактировалось 2 раза.

Sergey777
Сообщения: 68
Зарегистрирован: 30 мар 2015, 17:16

Re: Удаление Table Row через контекстное меню

Сообщение Sergey777 » 04 фев 2016, 10:58

mrstuff88 писал(а):Здравствуйте. Хочу сделать, чтобы по нажатию на Table Row появлялось Context Menu с подтверждением об удалении данной row. Table Row`s создаются программно и XML файл отсутствует, так что findviewbyId использовать не получается. Вот код создания Table Row:

Код: Выделить всё

   int nameColumn= tableCursor.getColumnIndex("someColumn");
            String reserveName = tableCursor.getString(nameSome);
            final TableLayout tl = (TableLayout) findViewById(R.id.mainLayout);
           TableRow tr = new TableRow(this);
            registerForContextMenu(tl);

            tl.setStretchAllColumns(true);
            tl.setShrinkAllColumns(true);
            tr.setGravity(Gravity.CENTER);
            tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));

            TextView textview = new TextView(this);
            textview.setText(reserveName);
            textview.setTextColor(Color.BLACK);
            textview.setTextSize(20);
            textview.setGravity(Gravity.START);
            tr.addView(textview);
Далее, создал контекстное меню, которое реагирует на нажатие и может выводить ЛОГ.

Код: Выделить всё

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenu.ContextMenuInfo menuInfo) {
    if (v.getId()==R.id.mainLayout) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
        menu.setHeaderTitle("Delete row?");

        menu.add(0, 0, 0, "Yes");

    }
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    if (item.getItemId() == 0) {
        Log.d(LOG_TAG, "ПРОВЕРКА!");



        return true;
    }
    return super.onContextItemSelected(item);
}
Но никак не получается получить(извиняюсь за тавтологию) значения нажатой Table Row. В этом месте студия банально не видит Table Row`s. Подскажите, как можно это реализовать?
P.S. пробовал удалять через onLongClick - прекрасно работает, но метод onLongClick находится непосредственно в месте, где создаются Table Row`s, поэтому и работает. Надеюсь на Вашу помощь :!:
Здравствуйте для удаления вида есть атрибут removeView(), а так же removeAllViews() для удаления всех дочерних элементов родителя. Чтобы был доступ к созданному TableRow не только в методе onCreate, но и в других методах внутри Вашего класса, Вам нужно объявить
TableRow tr;
TableLayout tl;
сразу же после объявления класса Вашей активности, где создаётся TableRow. Кроме того если TableRow должен быть создан внутри TableLayout, то вам в коде не хватает строчки:

Код: Выделить всё

  tl.addView(tr); 
Тогда удалить TableRow tr из родительского TableLayout можно будет так:

Код: Выделить всё

 tl.removeView(tr);  

mrstuff88
Сообщения: 9
Зарегистрирован: 13 янв 2016, 23:58

Re: Удаление Table Row через контекстное меню

Сообщение mrstuff88 » 05 фев 2016, 05:21

Sergey777 писал(а):

Код: Выделить всё

  tl.addView(tr); 
Тогда удалить TableRow tr из родительского TableLayout можно будет так:

Код: Выделить всё

 tl.removeView(tr);  
Благодарю за ответ, но вопрос был в другом. Как удалить tr - это понятно. Вопрос в том, как определить, какая ИЗ tr` была нажата и удалить именно её

Sergey777
Сообщения: 68
Зарегистрирован: 30 мар 2015, 17:16

Re: Удаление Table Row через контекстное меню

Сообщение Sergey777 » 05 фев 2016, 10:32

mrstuff88 писал(а):
Sergey777 писал(а):

Код: Выделить всё

  tl.addView(tr); 
Тогда удалить TableRow tr из родительского TableLayout можно будет так:

Код: Выделить всё

 tl.removeView(tr);  
Благодарю за ответ, но вопрос был в другом. Как удалить tr - это понятно. Вопрос в том, как определить, какая ИЗ tr` была нажата и удалить именно её
А Вы их динамически создаёте или их какое-то известное количество?

mrstuff88
Сообщения: 9
Зарегистрирован: 13 янв 2016, 23:58

Re: Удаление Table Row через контекстное меню

Сообщение mrstuff88 » 05 фев 2016, 18:49

Sergey777 писал(а): А Вы их динамически создаёте или их какое-то известное количество?
Программно. В первом посте залил решение моего вопроса.

Ответить