从按钮单击获取父对象

时间:2011-11-11 08:42:25

标签: java android layout view

我有一个自定义类,它从xml中扩展其布局。在那个xml中我有一个按钮。 然后在我的活动中,我实现了自定义类并将其添加到:

  1. 线性布局(自定义类的视图)
  2. 一个类型化数组(孔对象)
  3. 现在我想要的是,如果按下按钮,对象将从两者中删除,即键入的数组和布局。 现在我的问题是,首先我有两个地方,我必须删除对象,其次,我无法找到一种方法来“找到”类型数组中的对象。该按钮仅返回其视图。使用.parent.parent,直到我到达自定义类视图的视图我能够从布局中删除它但似乎没有办法从buttonpress获取对象本身的引用。

    也许洞穴概念我是怎么做的,这是错误的,不知道。希望你能提供帮助。

    编辑:清除abit

    MActivity:

    public class MActivity extends Activity{
    private ArrayList<MCustomObject> objList = new ArrayList<MCustomObject>();
    @Override
    public void onCreate(Bundle savedInstanceState){
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout;
    
        MCustomObject obj1 = new CustomObject(this, "blabla1");
        objList.add(obj1);
        MCustomObject obj2 = new CustomObject(this, "blabla2");
        objList.add(obj2);
        MCustomObject obj3 = new CustomObject(this, "blabla3");
        objList.add(obj3);
        }
    }
    

    MCustomObject:

    public class MCustomObject{
    
    public MCustomObject(Context context, String xyz){
    LayoutInflater layoutInflater = LayoutInflater.from(context);
    view = layoutInflater.inflate(R.layout.m_custom_object_layout, null);
    
    button = (Button) view.findViewById(R.id.mButton);
    
    [...]
    

    m_custom_object_layout:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    
    
            <Button
                android:id="@+id/mButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/delete" />
    </LinearLayout>
    

    现在当我按下mButton时,我希望按钮所属的洞obj instanz从objList中删除。

4 个答案:

答案 0 :(得分:0)

您可以使用

View.getId()

找到数组中的按钮。

for(int i =0; i < array.size(); i++) {
    if(button.getId() == array.get(i).getId())
    /* Found! */ 
}

答案 1 :(得分:0)

我同意LAS_VEGAS用户, 当你创建按钮时,你应该设置按钮ID(button.id =),你可以通过

指出它们
public void onClick(View v) 
{
    if(v.getId ==  )
    {
          //whatever you want
    }
    else
    {

    }
}

答案 2 :(得分:0)

我就是这样做的。我建议使用ArrayList而不是简单的数组,因为它更好地支持remove等。 缺少一些上下文可以为您提供完整的解决方案(如何决定使用viewId删除?),但这应该可以帮助您。

private List<Custom> myListOfCustom = new ArrayList<Custom>();
// initialize myListOfCustom the way you want by using myListOfCustom.add(object)

// button clicked
public void buttonClicked(View v) {
    final int id = ...; // obtain id here
    myListOfCustom.remove(findCustomObjectWithId(id));
    // also remove the view from your layout
}

private Custom findCustomObjectWithId(int id) {
    for(Custom custom : myListOfCustomObjects) {
        if (custom.getId() == id) {
            return custom;
        }
    }
    return null; // custom object with givenm id was not in the list! alternatively, you can throw a RuntimeException here (something like an IllegalArgumentException) and catch it in the buttonClicked method
}

答案 3 :(得分:0)

这是我在你的问题中添加更多细节后写的第二个答案。第一个仍然有效,但并不真正适用于您的情况。我建议将你的按钮代码放在原始活动中,使用你已经作为回调传递的代码。类似的东西:

public class MCustomObject{
    private final String customId;

    public MCustomObject(final MActivity parent, final String customId, String xyz){ 
        this.customId = customId;
        LayoutInflater layoutInflater = LayoutInflater.from(parent);
        view = layoutInflater.inflate(R.layout.m_custom_object_layout, null);
        button = (Button) view.findViewById(R.id.mButton);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
               // do your other stuff
               parent.removeCustomObject(customId);
            }
        });
    }

    public String getId() {
        return customId;
    }

我将上下文参数类型更改为MActivity(并将其设为final,因为它在匿名类中使用)。如果您需要从多个活动(不仅仅是MCustomObject)构建MActivity,我建议您将removeCustomObject方法提取到界面中,然后让所有活动实现它

MActivity中,您添加了以下方法:

public void removeCustomObject(String customId) {
    objList.remove(findCustomObjectWithId(id));
}

private MCustomObject findCustomObjectWithId(int id) {
    for(MCustomObject custom : objList) {
        if (custom.getId() == id) {
            return custom;
        }
    }
    return null;
}

(注意:用

替换您的列表objList
Map<String, MCustomObject>
将customIds映射到对象的

将使查找更容易阅读)