Search code examples
javaandroidandroid-activitybutterknife

ButterKnife in multiple activity


This is the code that I try to use with ButterKnife but I got the following error when I run the project.

error: cannot find symbol class Activity
error: package Activity does not exist
error: package Activity does not exist

BaseActivity

public abstract class BaseActivity extends AppCompatActivity {

    private Unbinder unbinder;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutResource());
        ButterKnife.bind(this);

        setupUI();
    }


    protected abstract int getLayoutResource();

    protected abstract void setupUI();
}

MainActivity

public class MainActivity extends BaseActivity {

    @Override
    protected void setupUI() {

    }

    @Override
    protected int getLayoutResource() {
        return R.layout.activity_main;
    }
}

RegisterActivity

public class RegisterActivity extends BaseActivity {

    @BindView(R.id.editText_username)
    EditText et;

    @Override
    protected void setupUI() {


        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);


    }

    @Override
    protected int getLayoutResource() {
        return R.layout.activity_register;
    }

    @Override
    public void onBackPressed() {
        this.finish();
    }
}

What's my mistake why I can't bind multiple Activities with the abstract class?

Github Project


Solution

  • First, you don't need Unbinder for Activitybecause Unbinder is only needed forFragment`.

    Second, you better use another method to be override so that you don't need to set the onCreate. Something like this:

    public abstract class BaseActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(getLayoutResource());
            ButterKnife.bind(this);
    
            setupUI();
        }
    
        protected abstract int getLayoutResource();
    
        protected abstract void setupUI();
    }
    

    which then you can use:

    public class MainActivity extends BaseActivity {
    
        @Override
        protected void setupUI() {
          // setup the UI.
        }
    
        @Override
        protected int getLayoutResource() {
            return R.layout.activity_main;
        }
    }
    

    Here is the working example for using ButterKnife with abstract class:

    https://github.com/isnotmenow/ButterKnifeAbstractSample