Я новичок в разработке 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.
Я не нахожу ничего о внешних радиокнопках, есть ли решение для этого?
Спасибо за чтение (извините за английский).
Я не понял это, но я нашел другой способ, который работает. В 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 используется, когда пользователь касается экрана за пределами диалогового окна или использует кнопку возврата.