2014-02-02 4 views
1

Я создал сложный вид, который состоит из трех видов, двух ImageButtons и одного EditText. Я пытаюсь создать новую кнопку «MyView» каждый раз щелкнув по кнопке. Во-первых, я решил установить onClick в xml, надеясь, что каждый раз, когда создается новый MyView, у него уже будет набор слушателей, но он, похоже, не работает. Итак, мой вопрос: как установить onClick-прослушиватель для кнопки внутри составного вида, а метод - в другом классе? Метод Я говорю о addViewBelow() в ViewControl ВласOnClick прослушиватель для кнопки внутри составного вида

MyView.xml 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" > 

<EditText 
    android:layout_width="0sp" 
    android:layout_height="wrap_content" 
    android:id="@+id/text" 
    android:layout_weight="80" /> 

<ImageButton 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:layout_weight="10" 
    android:id="@+id/add" 
    android:onClick="addViewBelow" 
    android:clickable="true" 
    android:background="@drawable/add" /> 

<ImageButton 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:layout_weight="10" 
    android:id="@+id/rmv" 
    android:background="@drawable/rmv" /> 

</LinearLayout> 

MyView.java

public class MyView extends LinearLayout { 

private EditText txt; 
private ImageView add, rmv; 

public MyView(Context context) 
{ 
super(context); 

LayoutInflater inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
inflater.inflate(R.layout.myview, this); 

txt = (EditText) findViewById(R.id.text); 
add = (ImageView) findViewById(R.id.add); 
rmv = (ImageView) findViewById(R.id.rmv); 

} 



public MyView(Context context, AttributeSet attrs) { 
super(context, attrs); 

LayoutInflater inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
inflater.inflate(R.layout.myview, this); 

txt = (EditText) findViewById(R.id.text); 
add = (ImageView) findViewById(R.id.add); 
rmv = (ImageView) findViewById(R.id.rmv); 


} 

ViewControl.java

public class ViewControl implements OnClickListener { 

    LinkedList<MyView> pathView; 
    Button mainButton; 
    RelativeLayout rl; 
    Activity act; 
    int lastId; 

public ViewControl(Activity activity) { 

act = activity; 
//stuff 

} 

@Override 
public void onClick(View v) { 
//stuff 

    } 

public void addViewBelow() { 

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
     LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.BELOW, lastId); 

MyView mv = new MyView(act); 

mv.setId(UniqueID.generateViewId()); 
mv.setLayoutParams(params); 
lastId = mv.getId(); 
pathView.add(mv); 
rl.addView(pathView.getLast()); 
} 
} 

ответ

2

Для работать, этот метод должен быть в Контекст View, который чаще всего представляет собой Activity.

В вашем случае, я предлагаю следующее:

Добавить этот метод MyView:

public void setClickListener(OnClickListener listener){ 
    add.setOnClickListener(listener); 
} 

в addViewBelow, сделайте следующее:

mv.setClickListener(new OnClickListener(){ 
    @Override 
    public void onClick(View v){ 
     addViewBelow();  
    } 
}); 
+0

Он работает, спасибо! Раньше я думал о чем-то подобном, но не был уверен, что это хорошая идея, поэтому я просто пропустил это. Я соглашусь с этим как можно скорее :) EDIT: И замечательно, что вы упомянули о том, что XML-часть, где метод должен быть только в контексте View, больше не тратить время на попытку сделать что-то, что невозможно. – user3086577

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