Этот метод повторяется в нескольких активити. Не получается оптимизировать? Попытался решить ч/з 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 шт):

Автор решения: Sergei Buvaka

Создаете класс, который реализует интерфейс 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());
→ Ссылка
Автор решения: woesss

Есть несколько вариантов:
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());
→ Ссылка