Используйте GetCheckedRadioButtonId () с внешней группой радиосвязи

1

Я новичок в разработке Android и заблокирован на моем проекте. Я искал решение все это утро и не нашел, вот оно.

Я сделал макет с радиогруппой и несколькими радиопереключателями. Я использую его для разных взглядов на мой проект.

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

Нет проблем с этим, я получаю его с LayoutInflater и могу создать вид моего макета. Тогда я могу получить радиогруппу этого представления.

Проблема в том, что я не могу этим манипулировать. Радиогруппа распознана, но я не могу получить проверенную радиокнопку, она всегда возвращает -1.

Вот метод onCreate, где создается представление.

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);

        LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
        View rank_W = inflater.inflate(R.layout.dialog_layout_w, (ViewGroup) findViewById(R.id.rank_w));
        View rank_M = inflater.inflate(R.layout.dialog_layout, (ViewGroup) findViewById(R.id.rank_m));

        // I also tried the commented way to make the view, it didn't change anything.

        //viewRank = getLayoutInflater().inflate(R.layout.dialog_layout, null);
        //viewRankW = getLayoutInflater().inflate(R.layout.dialog_layout_w, null);

        tvT = findViewById(R.id.tv_T);
        tvR = findViewById(R.id.tv_R);
        dp = findViewById(R.id.dp);
        rankM = findViewById(R.id.rankM);
        rankW = findViewById(R.id.rankW);

        rankM.setEnabled(false);
        rankW.setEnabled(false);

        gamesDB = new GamesDB(this);

        rgT = findViewById(R.id.rg_t);
        rgRM = rank_M.findViewById(R.id.rg_ranks);
        rgRW = rank_W.findViewById(R.id.rg_ranksW);

        rankM.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (rgT.getCheckedRadioButtonId() == R.id.rd_mm) {
                    rM = true;
                    dialogRank(view);

                } else if (rgT.getCheckedRadioButtonId() == R.id.rd_wm) {
                    rM = true;
                    dialogRankW(view);
                }
            }
        });
}

Я пытаюсь получить проверенный переключатель в методе dialogRank (view), вот он:

public void dialogRank(View view) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        LayoutInflater inflater = getLayoutInflater();
        View dialogLayout = inflater.inflate(R.layout.dialog_layout, null);
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                //rgRM = rank_M.findViewById(R.id.rg_ranks);
                int radioButtonID = rgRM.getCheckedRadioButtonId();
                View radioButton = rgRM.findViewById(radioButtonID);
                int idx = rgRM.indexOfChild(radioButton);
                if (rM) {
                    newRankM = idx;
                    rM = false;
                } else if (rW) {
                    newRankW = idx;
                    rW = false;
                }
            }
        });
        builder.setView(dialogLayout);
        builder.show();
    }

Таким образом, в этом методе открывается диалоговое окно со списком переключателей, и цель для меня состоит в том, чтобы получить индекс проверенного переключателя, когда пользователь нажимает кнопку ОК. Но idx возвращает -1.

Я не нахожу ничего о внешних радиокнопках, есть ли решение для этого?

Спасибо за чтение (извините за английский).

Теги:
android-layout
radio-button
radio-group

1 ответ

0

Я не понял это, но я нашел другой способ, который работает. В onCreate мне не нужно получать представление внешнего макета, но метод dialogRank(View view) изменился, вот он:

public void dialogRank(View view) {
        final Dialog dialog = new Dialog(context);
        dialog.setContentView(R.layout.dialog_layout);
        dialog.setTitle("Select a rank");

        Button ok = dialog.findViewById(R.id.btnOK);

        dialog.show();

        dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialogInterface) {
                rgRM = dialog.findViewById(R.id.rg_ranks);
                int idB = rgRM.getCheckedRadioButtonId();
                int index = rgRM.indexOfChild(rgRM.findViewById(idB));
                if (rM && index != -1) {
                    newRankM = index;
                    changeR = true;
                } else if (rW && index != -1) {
                    newRankW = index;
                    changeR = true;
                }
                if (rM) rM = false;
                if (rW) rW = false;
            }
        });

        ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.cancel();
            }
        });
    }

Для переменной контекста, которую я объявляю в своей деятельности, final Context context = this; ,

Откроется диалоговое окно макета dialog_layout а в cancelListner rgRM есть радиогруппа этого макета. Метод getCheckedRadioButtonId работает и возвращает идентификатор радиокнопки. Затем мы можем получить его индекс с помощью rgRM.indexOfChild(rgRM.findViewById(idB)). Переменные changeR и rM/rW предназначены для других моих процедур.

Я использую OnCancelListener потому что он наиболее приспособлен для использования, которое я ищу, метод onCancel используется, когда пользователь касается экрана за пределами диалогового окна или использует кнопку возврата.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню