バターナイフライブラリを使用してビューを完全に挿入しました。しかし、たとえばonclick
などのリスナーを実装しようとすると、それらを実装できません。次のJavaコードは、私の問題を理解するのに役立ちます。
Javaコード:
public class LoginActivity extends ActionBarActivity{
@InjectView(R.id.toolbar) Toolbar toolbar;
@InjectView(R.id.btn_login) Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
ButterKnife.inject(this);
initialize();
//initListeners();
@OnClick(R.id.btn_login)
public void submit(View view) {
// TODO submit data to server...
}
}
/*private void initListeners() {
@OnClick(R.id.btn_login)
public void login(){
}
}*/
private void initialize() {
setSupportActionBar(toolbar);
getSupportActionBar().setIcon(R.drawable.toolbar_icon);
getSupportActionBar().setTitle(null);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
}
なぜ起こっているのか教えてください。コードに何か問題がありますか?次のURLを使用してButterKnifeと互換性のあるIDEを既に構成しています。
http://stackoverflow.com/questions/27754811/onclick-is-not-working-in-implementation-of-butterknife-library
この問題に関する提案をお願いします。前もって感謝します..
MainActivity.Java
import Android.os.Bundle;
import Android.support.v7.app.ActionBarActivity;
import Android.view.View;
import Android.widget.Button;
import Android.widget.Toast;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
public class MainActivity extends ActionBarActivity {
@InjectView(R.id.button)
Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
}
@OnClick(R.id.button)
void submitButton(View view) {
Toast.makeText(this, "Click", Toast.LENGTH_SHORT).show();
}
}
およびactivity_main.xml部分
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin"
Android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="New Button"
Android:id="@+id/button"
Android:layout_alignParentTop="true"
Android:layout_alignParentLeft="true"
Android:layout_alignParentStart="true"
Android:layout_marginLeft="59dp"
Android:layout_marginStart="59dp"
Android:layout_marginTop="132dp"
/>
</RelativeLayout>
build.gradleファイル(アプリ)
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.Android.support:appcompat-v7:22.0.0'
compile 'com.jakewharton:butterknife:6.1.0'
}
私の場合、これは私の解決策です
add classpath in gradle(Project)
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.Android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:Android-apt:1.8'
}
}
and gradle(Module)add apply and apt
apply plugin: 'com.neenbedankt.Android-apt'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.jakewharton:butterknife:8.2.1'
apt 'com.jakewharton:butterknife-compiler:8.2.1'
}
ファイルJava
@OnClick(R.id.btn_login)
public void submit(View view) {
// TODO submit data to server...
}
アノテーションを使用する前に、butterKnifeをバインドする必要があります。
これらの依存関係をgradle.buildに追加します
_compile 'com.jakewharton:butterknife:8.4.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
_
次に、バインドをonCreate ButterKnife.bind(this);
に追加します
次に、ボタンにコードを実行します。メソッドはパブリックで、butterKnifeで、onClickをXMLに追加する必要はありません。また、メソッドはonCreateの外側にある必要があります。メソッドの上にあるアノテーションを使用して割り当てるボタンを自動的に取得します。
_@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick(R.id.btn_login)
public void submit(View view){
//Do your code here.
}
_
必要な依存関係をすべて追加してください
dependencies {
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}
以下のコードスニペットで行ったように、@OnClick
をonCreate
メソッドから移動する必要があります。
以下に投稿したコードは、想定どおりに動作するはずです(ButterKnife
も使用しています)。
public class LoginActivity extends ActionBarActivity{
@InjectView(R.id.toolbar) Toolbar toolbar;
@InjectView(R.id.btn_login) Button login;
@OnClick(R.id.btn_login)
public void submit(View view) {
// TODO submit data to server...
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
ButterKnife.inject(this);
initialize();
}
private void initialize() {
setSupportActionBar(toolbar);
getSupportActionBar().setIcon(R.drawable.toolbar_icon);
getSupportActionBar().setTitle(null);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
}