#java #android #android-studio
#java #Android #android-studio
Вопрос:
У меня есть прослушиватель событий, который прослушивает только 1 кнопку (которая Button hello = view.findViewById(R.id.hello)
).
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_general, container, false);
Button hello = view.findViewById(R.id.hello);
// Text to speech
tts = new Tts();
tts.init(getActivity(), "Reza");
hello.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String id = getResources().getResourceEntryName(view.getId());
tts.speak(id);
}
});
return view;
}
Теперь у меня есть несколько кнопок, и при нажатии на них должно произойти то же самое. Я не хочу копировать и вставлять свой код для всех других кнопок.
Это то, что я пробовал:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_general, container, false);
// Get the button
Button btn = view.findViewById(R.id.hello);
switch (getResources().getResourceEntryName(view.getId())) {
case "hello":
btn = view.findViewById(R.id.hello);
break;
case "observed":
btn = view.findViewById(R.id.observed);
break;
}
// Text to speech
tts = new Tts();
tts.init(getActivity(), "Reza");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String id = getResources().getResourceEntryName(view.getId());
tts.speak(id);
}
});
return view;
}
Но я получаю сообщение об ошибке:
android.content.res.Resources$NotFoundException: не удается найти идентификатор ресурса # 0xffffffff
Должно быть, что-то не так с моим оператором switch.
Ответ №1:
Вы можете использовать свойство onClick в xml для всех кнопок следующим образом
<Button
android:id="@ id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnHandler"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@ id/fragment_container"
android:text="btn1"/>
<Button
android:id="@ id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnHandler"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/btn1"
android:text="btn2"/>
<Button
android:id="@ id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnHandler"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/btn2"
android:text="btn3"/>
И внутри btnHandler выполните следующее:
В Kotlin:
fun btnHandler(view: View) {
when(view.id) {
R.id.btn1 -> Log.d(TAG, "btn1")
R.id.btn2 -> Log.d(TAG, "btn2")
R.id.btn3 -> Log.d(TAG, "btn3")
}
}
В Java используйте switch-case (если есть ошибка, которую вы исправляете, я не использую Java в текущее время и могу допустить ошибку)
public void btnHandler(view: View) {
switch(view.id) {
case R.id.btn1:
Log.d(TAG, "btn1");
break;
case R.id.btn2:
Log.d(TAG, "btn2");
break;
case R.id.btn3:
Log.d(TAG, "btn3");
break;
}
}
Ответ №2:
Вы ищете идентификатор, который может не существовать
....
// Get the button
Button btn = view.findViewById(R.id.hello); /// here if the view is observed, does it contain R.id.hello?
switch (getResources().getResourceEntryName(view.getId())) {
Ответ №3:
Ваша проблема лежит в этой области:
switch (getResources().getResourceEntryName(view.getId())) {
case "hello":
btn = view.findViewById(R.id.hello);
break;
case "observed":
btn = view.findViewById(R.id.observed);
break;
}
Вы идентифицируете кнопку, а затем используете оператор switch в представлении fragment_general, тем самым пытаясь присвоить кнопке идентификатор фрагмента. Таким образом, он не найдет идентификатор. Я бы предложил реализовать вот так.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_general, container, false);
// Get the button
Button btn = view.findViewById(R.id.hello);
Button observeBtn = view.findViewById (R.id.observed);
// Text to speech
tts = new Tts();
tts.init(getActivity(), "Reza");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
makeTTS("Hello")
}
});
observeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
makeTTS("Observe")
}
});
return view;
}
public void makeTTS(String aText){
tts.speak(aText);
}
Ответ №4:
это будет легко реализовать и упростить ваш код, проверьте:
-
Реализовать
View.OnClickListener
в классpublic class Test extends Activity implements View.OnClickListener
-
В методе CreateView установите прослушиватели для каждой кнопки:
btnHello = view.findViewById(R.id.hello); btnObserved = view.findViewById(R.id.observed); btnHello.setOnClickListener(this); btnObserved.setOnClickListener(this);
-
Затем вы должны переопределить
onClick
метод следующим образом:@Override public void onClick(View view) { switch (view.getId()){ case R.id.hello: case R.id.observed: tts.speak(view.getId()); break; } }