2016-01-25 8 views
1

У меня есть простая относительная компоновка с одной кнопкой.Butter Knife - Слушатели для кнопок внутри включают

И я использую этот макет несколько раз, используя в основном макете.

Его можно написать один метод (с использованием или не нож для масла) для всех этих кнопок с помощью слушателя (это) и не создавать несколько слушателей, как это ---->

(relativeLayout1.findViewById(R.id.currencyButton)).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(ForeignExchangeActivity.this, "Euro", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    (relativeLayout2.findViewById(R.id.currencyButton)).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(ForeignExchangeActivity.this, "GBP", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

Одиночный деталь layaout

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/colorBackgroundSeekbar"> 

    <TextView 
     android:id="@+id/currencyTitle" 
     android:text="EUR - PLN" 
     android:padding="5dp" 
     android:textSize="20sp" 
     android:textStyle="bold" 
     android:textColor="#FFFFFF" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:background="@color/colorButtonHiglight"/> 

    <TextView 
     android:id="@+id/currencyDate" 
     android:layout_below="@id/currencyTitle" 
     android:text="24-01-2015" 
     android:textStyle="bold" 
     android:layout_marginTop="12dp" 
     android:gravity="center_horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/currencyValue" 
     android:layout_below="@+id/currencyDate" 
     android:text="4.4567" 
     android:layout_marginTop="12dp" 
     android:textColor="#FFFFFF" 
     android:textStyle="bold" 
     android:textSize="25sp" 
     android:paddingTop="10dp" 
     android:paddingBottom="10dp" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:layout_centerHorizontal="true" 
     android:gravity="center_horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@color/colorCalculatorActivity"/> 


    <TextView 
     android:text="Inna data" 
     android:textAllCaps="false" 
     android:layout_marginTop="10dp" 
     android:id="@+id/currencyButton" 
     android:textSize="12sp" 
     android:padding="5dp" 
     android:gravity="center" 
     android:layout_below="@id/currencyValue" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:background="@drawable/button_rounder_corners" 
     android:layout_alignLeft="@+id/currencyValue" 
     android:layout_alignRight="@+id/currencyValue" 
     android:onClick="onClickDataButton" 
     /> 


    <View 
     android:layout_marginTop="10dp" 
     android:layout_below="@id/currencyButton" 
     android:layout_width="match_parent" 
     android:layout_height="1dp"/> 





</RelativeLayout> 

Пример Inlcude

<LinearLayout 
       android:layout_width="match_parent" 
       android:weightSum="2" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" 
       android:layout_marginTop="@dimen/activity_horizontal_margin" 
       android:paddingLeft="@dimen/activity_horizontal_margin" 
       android:paddingRight="@dimen/activity_horizontal_margin"> 


       <include 
        android:id="@+id/currency1" 
        android:layout_height="wrap_content" 
        android:layout_width="0dp" 
        android:layout_weight="1" 
        layout="@layout/single_item_foreign_exchange"/> 


       <View 
        android:layout_width="10dp" 
        android:layout_height="match_parent"/> 

       <include 
        android:id="@+id/currency2" 
        android:layout_height="wrap_content" 
        android:layout_width="0dp" 
        android:layout_weight="1" 
        layout="@layout/single_item_foreign_exchange"/> 

      </LinearLayout> 

переплетены inlcude layaouts

@Bind(R.id.currency1) RelativeLayout relativeLayout1; 
    @Bind(R.id.currency2) RelativeLayout relativeLayout2; 

решаемые

Добавлен OnClick метод к моему RelativeLayaout. Потом создали что-то вроде этого

public void onClickDataButton(View view){ 
     if (view == buttonEuro){ 
      Toast.makeText(ForeignExchangeActivity.this, "Euro", Toast.LENGTH_SHORT).show(); 
     } else if (view == buttonGBP){ 
      Toast.makeText(ForeignExchangeActivity.this, "GBP", Toast.LENGTH_SHORT).show(); 
     } 
    } 

И моя кнопка выглядит как

buttonEuro = (TextView) relativeLayout1.findViewById(R.id.currencyButton); 
     buttonGBP = (TextView) relativeLayout2.findViewById(R.id.currencyButton 

);

поэтому тот же идентификатор кнопки, но был обнаружен в разных версиях.

+0

использования функции OnClick на кнопках в XML и делать то, что вы хотите в вашей функции –

+0

у меня нет кнопки .. есть только одна кнопка в одном макете .. и im, включая этот layaout несколько раз – Esperanz0

+0

Попробуйте создать операторы switch или логику If() в вашем onClickListener(). – Stanojkovic

ответ

0

EDIT: Пример для вашего случая: кнопки с одинаковым идентификатором в разных макетах.

1) Вы можете перебирать массив кнопок.

2) Или: Создайте пользовательский Button-Class, который содержит все, что вам нужно (например, поле для валюты и т. Д.), И используйте это в своем макете.

Вид псевдокод (не проверено):

class CurrencyButton extends android.widget.Button { 
    string currency; 

    public void init(Context ctx, String currency) { 
     this.currency = currency; 

     this.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(ctx, this.currency, Toast.LENGTH_SHORT).show(); 
     } 
     }); 
    } 

    public void doSomeOtherFancyCurrencyLogicHere() { 
     .... 
    } 
} 

Это может быть использовано в макете файлов: (Псевдо)

<your.package.CurrencyButton 
    id="@+id/currency_button_eur" 
    LayoutParams etc /> 

<your.package.CurrencyButton 
    id="@+id/currency_button_gbp" 
    LayoutParams etc /> 

<!-- EDIT: as in your example with layouts in single_item_foreign_exchange --> 

<your.package.CurrencyButton 
    id="@+id/currency_button" 
    LayoutParams etc /> 

Если вы используете нож для масла

@InjectView(R.id.currency_button_eur) 
your.package.CurrencyButton buttonEUR; 

@InjectView(R.id.currency_button_gbp) 
your.package.CurrencyButton buttonGBP; 

// ... initialize them somewhere 
buttonEUR.init(this, "EUR"); 
buttonGPB.init(this, "GBP"); 

// EDIT: as in your example with layouts 
((your.package.CurrencyButton) relativeLayout1.findViewById(R.id.currencyButton)).init(this, "EUR"); 
((your.package.CurrencyButton) relativeLayout2.findViewById(R.id.currencyButton)).init(this, "GBP"); 

На самом деле вы можете пойти еще дальше и расширить этот класс для каждой валюты, но это должно сделать это в первую очередь.

0

Хорошо, я видел, что вы РЕШИТЕ ​​ваш вопрос.Но так как я уже работал над этим ответом, я добавлю это здесь в любом случае: P

class CurrencyLayout extends FrameLayout { 
String currency; 

// Constructors that calls init after super(...); 

public void init(Context ctx, AtributeSet attrs) { 
    View includedLayout = LayoutInflater.fromContext(ctx).inflate(R.layout.single_item_foreign_exchange, this, false); 

    TypedArray a = context.getTheme().obtainStyledAttributes(
      attrs, 
      R.styleable.CurrencyLayout, 
      0, 0); 

    try { 
     final String currency = a.getString(R.styleable.CurrencyLayout_currencyName); 
    } finally { 
     a.recycle(); 
    } 

    includedLayout.findViewById(R.id.currencyName).setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Toast.makeText(ctx, this.currency, Toast.LENGTH_SHORT).show(); 
    } 
    }); 
} 

this.addView(includedLayout); 

}

внутри res/values/attrs.xml добавить что-то вроде этого:

<resources> 
    <declare-styleable name="CurrencyLayout"> 
     <attr name="currencyName" format="string" /> 
    </declare-styleable> 
</resources> 

И внутри деятельности макет:

<LinearLayout 
android:layout_width="match_parent" 
android:weightSum="2" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:layout_marginTop="@dimen/activity_horizontal_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin"> 


    <your_package.CurrencyLayout 
     android:id="@+id/currency1" 
     android:layout_height="wrap_content" 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     custom:currencyName="GBP"/> 


    <View 
     android:layout_width="10dp" 
     android:layout_height="match_parent"/> 

    <your_package.CurrencyLayout 
     android:id="@+id/currency2" 
     android:layout_height="wrap_content" 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     custom:currencyName="EUR"/> 

</LinearLayout> 

I hop е это все равно поможет вам: D

Более подробную информацию о custom views and attributes

+0

Я попробую это позже. Спасибо ! – Esperanz0