2016-02-05 4 views
4

Я создал пользовательскую кнопку и попытался использовать аннотацию , но она не работает.ButterKnife onClick пользовательский вид

Возможно ли использовать для пользовательских представлений, подобных этому, или мне придется использовать по умолчанию onClickListener?

CustomButton

public class CustomButton extends RelativeLayout { 

public CustomButton(Context context) { 
    super(context); 
} 

public CustomButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    init(); 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
public CustomButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
    init(); 
} 

private void init() { 
    inflate(getContext(), R.layout.button_layout, this); 
} 

Меню

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    final View rootView = inflater.inflate(R.layout.fragment_menu, container, false); 
    ButterKnife.bind(this, rootView); 
    return rootView; 
} 

@OnClick(R.id.button_play) 
public void onButtonPlayClicked() { 
    // NOT CALLED 
} 

Компоновка меню

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/bg_pattern" 
android:padding="15dp"> 

<com.example.ui.custom.CustomButton 
    android:id="@+id/button_play" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true"/> 
</RelativeLayout> 
+0

Вы используете Eclipse или Android Studio? –

+0

Я использую Android Studio – cRobot

ответ

2

От http://jakewharton.github.io/butterknife/

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

public class FancyButton extends Button { 
    @OnClick 
    public void onClick() { 
     // TODO do something! 
    } 
} 

Надеется, что это помогает !!

+0

Спасибо, но это не работает. Мне нужно использовать '@ onClick' в CustomButton из Activity – cRobot

-1
In your activity try to add.. 

ButterKnife.inject(this); 
check this code 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
ButterKnife.inject(this); 
} 

@OnClick(R.id.buttonAlert) 
public void alertClicked(View v){ 
new AlertDialog.Builder(v.getContext()) 
    .setMessage(getFormattedMessge()) 
    .setNeutralButton("OK", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
     dialog.dismiss(); 
     } 
    }) 
    .show(); 
} 
+0

Этот код работает для представлений по умолчанию, а не для пользовательских. к сожалению – cRobot

2

Я испытал такую ​​же проблему. Я решил, обработав отправку событий в моем пользовательском представлении.

В вашем случае:

public class CustomButton extends RelativeLayout { 

    // ... 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_UP) { 
      if(hasOnClickListeners()) { 
       callOnClick(); 
      } 
     } 
     return super.dispatchTouchEvent(event); 
    } 

    // ... 

} 

Надеется, что это может помочь.

+1

Это должен быть принят ответ, у меня была та же проблема, что и у OP, и ваш мир кода решил проблему ... –

3

В настоящее время я сталкиваюсь с той же проблемой и нашел довольно приятное решение. I override setOnClickListener (OnClickListener l) внутри моего представления и назначить слушателя на мою кнопку. После этого @OnClick работает должным образом.

В вашем случае вы можете добавить следующий метод:

@Override 
public void setOnClickListener(OnClickLister l) { 
    ButterKnife.findById(this.getView(), R.id.button_play).setOnClickLister(l); 
} 
2

Я была такая же проблема, и я нашел исправить!

Замените корневой вид XML вашего настраиваемого представления (R.layout.button_layout) вместо <merge>. Как вы можете прочитать в документации ButterKnife:

Привяжите детей к просмотру в полях с использованием ButterKnife.bind (this). Если вы используете теги <merge> в макете и раздуваете в конструкторе пользовательского вида, вы можете позвонить сразу после. Кроме того, пользовательские типы типов, завышенные от XML, могут использовать его в обратном вызове onFinishInflate().

В моем случае я заменил:

<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:background="@drawable/bg_button_default" 
android:clickable="true" 
android:focusable="true" 
android:padding="@dimen/normal_padding" 
tools:background="@color/white" 
tools:layout_height="80dp"> 

By:

<merge 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools"> 

Теперь конфигурация Родительское представление находится внутри метода инициализации CustomView. Все события OnClick и OnLongClick работают!

Надеюсь, это поможет!

+1

да эта работа! Но я также добавил код setClickable (true); внутри пользовательский вид класс. Потому что мне понадобится clieckable root view –

Смежные вопросы