1 событие для нескольких кнопок

#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:

это будет легко реализовать и упростить ваш код, проверьте:

  1. Реализовать View.OnClickListener в класс

    public class Test extends Activity implements View.OnClickListener

  2. В методе CreateView установите прослушиватели для каждой кнопки:

     btnHello = view.findViewById(R.id.hello);
    btnObserved = view.findViewById(R.id.observed);
    btnHello.setOnClickListener(this);
    btnObserved.setOnClickListener(this);
      
  3. Затем вы должны переопределить onClick метод следующим образом:

     @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.hello:
            case R.id.observed:
                tts.speak(view.getId());
            break;
        }
    }