Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[98.80.143.34] |
|
Сообщ.
#1
,
|
|
|
Добрый день. Надеюсь мне с этим вопросом помогут.
Есть страница пользователя, где он добавляем людей. Все отлично работает. В меню есть пункт добавить человека. Пользователь вводит данные, и строка добавляется в таблицу. Пример на картинке не могу прикрепить почему то. В каждой строке есть корзина, ее id mark. Но теперь мне надо, что бы при нажатии корзины, строка удалялась. Но никак не получается. Вот код страницы: package com.example.monitoringchildrensnutrition; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.preference.PreferenceManager; import android.text.TextUtils; import android.text.style.BackgroundColorSpan; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; import android.widget.Toast; import android.view.View.OnClickListener; import com.divyanshu.colorseekbar.ColorSeekBar; import com.google.android.material.bottomsheet.BottomSheetDialog; public class EducatorPage extends AppCompatActivity implements OnClickListener { Toolbar toolbar; //изменение цвета View view; ColorSeekBar colorSeekBar; int i; Button btnColorTable; TextView name_educator; String Value; String Value1; //сохраняем данные SharedPreferences sharedPreferences; //берем сохраненные данные SharedPreferences preferences; //для добавления ребенка AlertDialog.Builder dialogBuilder; AlertDialog dialog; EditText personal_account, surname_child, name_child, patronymic_child; Button add_to, cancellation; //добавляем ребенка в таблицу TableLayout table_children; TableRow tr; TextView number, fio_child, number_lc, balance; //нумерация строк static int count = 1; //удаляем ребенка ImageView mark; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.educator_page); toolbar = findViewById(R.id.toolbar_educator); setSupportActionBar(toolbar); view = (View) findViewById(R.id.view); colorSeekBar = (ColorSeekBar) findViewById(R.id.color_seekbar); btnColorTable = (Button) findViewById(R.id.btnColorTable); name_educator = (TextView) findViewById(R.id.name_educator); //невидимость для изменения цвета btnColorTable.setVisibility(View.INVISIBLE); colorSeekBar.setVisibility(View.INVISIBLE); //запоминаем ко всем данным sharedPreferences = getSharedPreferences("USER_DATA", MODE_PRIVATE); //берем сохраненные данные воспитателя preferences = getSharedPreferences("USER_DATA", MODE_PRIVATE); String name = preferences.getString("NAME", ""); String surname = preferences.getString("SURNAME", ""); String patronymic = preferences.getString("PATRONYMIC", ""); //берем сохраненный цвет фона i = preferences.getInt("COLOR", i); view.setBackgroundColor(i); //вписываем нужный текст в TextView Value = "Воспитатель:" + " " + surname + " " + name + " " + patronymic; name_educator.setText(Value); //добавляем ребенка в таблицу table_children = (TableLayout) findViewById(R.id.table_children); tr = (TableRow) findViewById(R.id.row); balance = (TextView) findViewById(R.id.balance); mark = (ImageView) findViewById(R.id.mark); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_educator, menu); return true; } @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); if (id == R.id.color_table) { btnColorTable.setVisibility(View.VISIBLE); colorSeekBar.setVisibility(View.VISIBLE); colorSeekBar.setOnColorChangeListener(new ColorSeekBar.OnColorChangeListener() { @Override public void onColorChangeListener(int i) { view.setBackgroundColor(i); //сохраняем выбранный цвет SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt("COLOR", i); editor.apply(); } }); btnColorTable.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final AlertDialog.Builder builder = new AlertDialog.Builder(EducatorPage.this); builder.setMessage("Подтверждаете ваш выбор?"); builder.setCancelable(true); builder.setNegativeButton("нет", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setPositiveButton("Да", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { btnColorTable.setVisibility(View.INVISIBLE); colorSeekBar.setVisibility(View.INVISIBLE); Toast.makeText(getApplicationContext(), "Цвет сохранен", Toast.LENGTH_SHORT).show(); } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); } }); } else if (id == R.id.add_child) { dialogBuilder = new AlertDialog.Builder(this); final View add_child = getLayoutInflater().inflate(R.layout.add_child, null); personal_account = (EditText) add_child.findViewById(R.id.personal_account); surname_child = (EditText) add_child.findViewById(R.id.surname_child); name_child = (EditText) add_child.findViewById(R.id.name_child); patronymic_child = (EditText) add_child.findViewById(R.id.patronymic_child); add_to = (Button) add_child.findViewById(R.id.add_to); cancellation = (Button) add_child.findViewById(R.id.cancellation); dialogBuilder.setView(add_child); dialog = dialogBuilder.create(); dialog.show(); add_to.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!TextUtils.isEmpty(personal_account.getText().toString()) && !TextUtils.isEmpty(surname_child.getText().toString()) && !TextUtils.isEmpty(name_child.getText().toString()) && !TextUtils.isEmpty(patronymic_child.getText().toString())) { //находим таблицу TableLayout tableLayout = (TableLayout) findViewById(R.id.table_children); //создаем экземпляр для создания строки LayoutInflater inflater = LayoutInflater.from(EducatorPage.this); //создаем строку TableRow tr = (TableRow) inflater.inflate(R.layout.table_row_plus, null); //находим ячейки и вставляем значения number = (TextView) tr.findViewById(R.id.number); //для нумерации строк int aInt = count++; String aString = Integer.toString(aInt); number.setText(aString); //вставляем остальные значения fio_child = (TextView) tr.findViewById(R.id.fio_child); //переводим введенные значения String tv1 = surname_child.getText().toString(); String tv2 = name_child.getText().toString(); String tv3 = patronymic_child.getText().toString(); //соединяем для вставки ФИО Value1 = tv1 + " " + tv2 + " " + tv3; fio_child.setText(Value1); number_lc = (TextView) tr.findViewById(R.id.number_lc); String tv4 = personal_account.getText().toString(); number_lc.setText(tv4); //добавляем строку tableLayout.addView(tr); dialog.dismiss(); Toast.makeText(getApplicationContext(), "Ребенок добавлен", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "Заполните все поля", Toast.LENGTH_SHORT).show(); } } }); cancellation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); } else if (id == R.id.exit) { final AlertDialog.Builder builder = new AlertDialog.Builder(EducatorPage.this); builder.setMessage("Вы действительно хотите выйти?"); builder.setCancelable(true); builder.setNegativeButton("нет", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setPositiveButton("Да", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(getApplicationContext(), MainActivity.class); startActivity(intent); } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); } else if (id == R.id.delete) { Toast.makeText(getApplicationContext(), R.string.delete, Toast.LENGTH_SHORT).show(); } return true; } @Override public void onClick(View v) { mark.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "Строчка удалена", Toast.LENGTH_SHORT).show(); } }); } } Подскажите, что у меня не так? |
Сообщ.
#2
,
|
|
|
Вопрос надо бы переместить/отразить в разделе Android. По имеющемуся «коду страницы» там с большей вероятностью смогут помочь.
Я был бы рад воспроизвести баг и попробовать его исправить, но я не Android-разработчик и хотелось бы, чтобы попробовать помочь, иметь проект целиком (если там есть что-то секретное — то урезанный до минимального воспроизведения ошибки). Вслепую, первое, что смущает (хотя, может, так и задумано) — обработчик onClick для корзины (mark) создаётся внутри другого обработчика onClick. Не получается именно удалить или сообщение "Строчка удалена" тоже не выводится? Срабатывает ли первичный onClick, который вешает Listener на корзину? |
Сообщ.
#3
,
|
|
|
Цитата kopilov @ Вопрос надо бы переместить/отразить в разделе Android. По имеющемуся «коду страницы» там с большей вероятностью смогут помочь. Я был бы рад воспроизвести баг и попробовать его исправить, но я не Android-разработчик и хотелось бы, чтобы попробовать помочь, иметь проект целиком (если там есть что-то секретное — то урезанный до минимального воспроизведения ошибки). Вслепую, первое, что смущает (хотя, может, так и задумано) — обработчик onClick для корзины (mark) зоздаётся внутри другого обработчика onClick. Не получается именно удалить или сообщение "Строчка удалена" тоже не выводится? Срабатывает ли первичный onClick, готорый вешает Listener на корзину? При старте данной страницы, там нет никакой таблицы, только шапка. Следовательно ImageView тоже нет. Она появляется первая, только когда пользователь вводит первого человека. Я пытался внутри onClick ввода первого человека это завести, но он ругался, и приложение слетало. А в какое место вы бы поставили вызов mark? Я тут совсем новичок, может и не так делаю. Сообщение не выходит. Я пока по нему и пытаюсь определить, работает или нет. |
Сообщ.
#4
,
|
|
|
Обсудили в личке.
Для тех, кто будет читать тему: проблема была в том, что Listener вешался на шаблонный экземпляр компонента, а надо было на создаваемый inflate-ом. |