Этот метод повторяется в нескольких активити. Не получается оптимизировать? Попытался решить ч/з BaseActivity
-Повторяющийся код:
private void onFabHomeClickListener() {
fab_home.setOnClickListener(v -> {
Intent intent = new Intent(GroomerActivity.this, MainActivity.class);
GroomerActivity.this.startActivity(intent);
});
}
-BaseActivity (как я пытался решить проблему):
public void onFabHomeClickListener(FloatingActionButton fab, Context context) {
fab.setOnClickListener(v -> {
Intent intent = new Intent(context, MainActivity.class);
getApplicationContext().startActivity(intent);
});
-Как я вызываю этот метод в наследуемом активити:
BaseActivity baseActivity = new BaseActivity();
baseActivity.onFabHomeClickListener(fab_home,GroomerActivity.this);
-Итог: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.getbase.floatingactionbutton.FloatingActionButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
Ответы (2 шт):
Создаете класс, который реализует интерфейс View.OnClickListener, прописываете в нем логику кликов и будет вам счастье:
class FabClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT,
"Вы можете скачать приложение по ссылке: https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID);
sendIntent.setType("text/plain");
v.getContext().startActivity(sendIntent);
Toast.makeText(v.getContext(), "Поделиться приложением", Toast.LENGTH_SHORT).show();
}
}
Далее в коде вы просто пишите
fab_home.setOnClickListener(new FabClickListener());
Есть несколько вариантов:
1. Делаем его утилитарным (статическим) и используем везде вместо дубликатов:
public static void onFabClickListener(Activity activity, View fab) {
fab.setOnClickListener(v -> {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT,
"Вы можете скачать приложение по ссылке: https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID);
sendIntent.setType("text/plain");
activity.startActivity(sendIntent);
Toast.makeText(activity, "Поделиться приложением", Toast.LENGTH_SHORT).show();
});
}
Желательно переместить его в отдельный класс с другими подобными методами.
2. Делаем базовый класс активности и реализуем в нём весь общий функционал, а активности, в которых этот функционал нужен наследуем от этого базового класса.
3. По сути сам метод и не нужен - можно вынести реализацию листенера в отдельный класс и назначать его кнопкам:
public class OnFabClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT,
"Вы можете скачать приложение по ссылке: https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID);
sendIntent.setType("text/plain");
v.getContext().startActivity(sendIntent);
Toast.makeText(v.getContext(), "Поделиться приложением", Toast.LENGTH_SHORT).show();
}
}
и везде вместо вызова того метода назначать наш листенер:
fab.setOnClickListener(new OnFabClickListener());