Слушатель нажатия кнопки во фрагменте.Android студия - PullRequest
0 голосов
/ 17 октября 2018

У меня проблема с попыткой реализовать прослушиватель нажатия кнопки во фрагменте.У меня нет проблем, если есть только одна кнопка, но у меня есть 3 кнопки в пользовательском интерфейсе фрагмента.

Вот что я получаю:

  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference

Код, я сделал его как публичный метод

@Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
      // Inflate the layout for this fragment
       View view = inflater.inflate(R.layout.fragment_blank, container, false);


  first=(Button) view.findViewById(R.id.button_first);
  first.setOnClickListener(this);
  second=(Button) view.findViewById(R.id.button_second);
  second.setOnClickListener(this);
  third=(Button) view.findViewById(R.id.button_third);
  third.setOnClickListener(this);

  // Also I tried these ones but its not possible to :
  //first.setOnClickListener((View.OnClickListener) getActivity());
  //second.setOnClickListener((View.OnClickListener) getActivity());
  //third.setOnClickListener((View.OnClickListener) getActivity());


    return view;
}

 @Override
    public void onClick(View view) {

    if (view.getId() == R.id.button_first) {

     //some code here
    }
    if (view.getId() == R.id.button_second) {
        //some code here
    }
    if (view.getId() == R.id.button_third) {
       //some code here
        }
 }

Я могу реализовать слушатель одной кнопки следующим образом:

@Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
       View view = inflater.inflate(R.layout.fragment_blank_fragment5, container, false);


  call= (Button) view.findViewById(R.id.button);
  call.setOnClickListener(new View.OnClickListener() {
  public void onClick(View v)
     {
         dialContactPhone("Some phone number");

     }

 });
      return view;
 }

Но я хотел бы знать, что я делаю неправильно с первым кодом.Почему существует null?

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Это нормально работает для меня.Настройка прослушивания кликов для каждой кнопки индивидуально.

View rootView = inflater.inflate(R.layout.fragment_default, container, false);

        rootView.findViewById(R.id.sell)
            .setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Your code
            }
        });
        rootView.findViewById(R.id.buy)
            .setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Your Code
            }

        });
        rootView.findViewById(R.id.bookbuddy)
            .setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Your Code
            }
        });
        rootView.findViewById(R.id.listing)
            .setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Your Code
            }
        });

return rootView;
0 голосов
/ 17 октября 2018

Вы не предоставили свой код класса фрагмента в своем первом примере, но, поскольку вы используете .setOnClickListener(this) и получаете ошибку в тот момент в своем коде, я собираюсь предположить, что вы не реализовали OnClickListener в своем классе.Если вы используете «this» для установки прослушивателя, и вы не реализовали OnClickListener в своем классе, setOnClickListener () ничего не найдет.Это то, что вызывает ваш NullPointerException.

Если вы хотите использовать «this» для настройки ваших слушателей и использовать метод onClick (View view) для управления вашими кликами, ваш класс должен реализовать OnClickListener.

Пример:

public class MyFragmentClass extends Fragment implements OnClickListener {
    // You can use "this" for .setOnClickListener() in this class
}
0 голосов
/ 17 октября 2018

Попробуйте это :

  • fragmet_blank xml, который вы можете определить 3 Button, например button_first, button_second, button_third, используя тот же идентификатор.

код Java

public class BlankFragment extends Fragment implements OnClickListener{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.fragment_blank, container, false);

Button f = (Button) v.findViewById(R.id.button_first);
Button s = (Button) v.findViewById(R.id.button_second);
Button t = (Button) v.findViewById(R.id.button_third); 
f.setOnClickListener(this);
s.setOnClickListener(this);
t.setOnClickListener(this);
return v;
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_first:

   //some code here

    break;
}

  case R.id.button_second:

   //some code here

    break;
  }
 case R.id.button_third:

   //some code here

    break;
}
 }
   } 
...