2011-11-11 7 views
1

xmlからレイアウトを膨張させるカスタムクラスがあります。その中にボタンがあります。 はその後、私の活動で、私はそのカスタムクラスをinstanziateし、それを追加します。今ボタンのクリックから親オブジェクトを取得

  1. リニアレイアウト(カスタムクラスのビュー)
  2. 型指定された配列(穴オブジェクト)

私は、ボタンが押されると、オブジェクトが型付き配列とレイアウトの両方から削除されることを望みます。 今私の問題は、最初にオブジェクトを削除する必要がある2つの場所があり、タイプされた配列のオブジェクトを「見つける」方法を見つけることができないということです。ボタンはそのビューのみを返します。 .parent.parentを使用すると、カスタムクラスのビューのビューに到達するまでレイアウトから削除できますが、ボタンプレスからオブジェクト自体への参照を取得する方法はありません。

多分、私がそれをやっている方法は、間違っています。あなたが助けることを願って

EDIT:clearifyする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を押すと、ボタンが属するホールオブジェクトがobjListから削除されます。

答えて

0

これは、質問に詳細を追加した後に書かれた2番目の回答です。最初のものはまだ有効ですが、実際にはあなたの状況には当てはまりません。私が示唆していることは、コールバックとして既に渡しているものを使って、ボタンのコードを元のアクティビティに置くことです。ような何か:

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製)。あなたが複数のアクティビティ(だけではなくMActivityからあなたMCustomObjectを構築する可能性が必要な場合は、その後、私はあなたがインターフェイスに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; 
} 

(NB:あなたがMAKうオブジェクトにcustomIdsをマッピングする

Map<String, MCustomObject> 

であなたのリストobjListを交換しますeルックアップの読みやすさ)

+0

私のために働く、素晴らしいサポートに感謝! – masi

+0

あなたも大歓迎です、私にとっても面白いです:) – Guillaume

0

あなたは、アレイ内のボタンを見つけること

View.getId() 

を使用することができます。

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

ボタンが配列内にあるとは思わないが、彼はカスタムビューについて話している。しかし、私は配列から何かを得る方法に同意します。 – Guillaume

+0

まあ、私は正確なカスタムオブジェクトについて話しています。私はその見解がわからない。それはxmlからそのレイアウトを膨らませる単純なJavaクラスです。それはそれを見解にしていますか? – masi

+0

'View'クラスから継承するか、' View'クラスから継承したものです。可能であれば – Caner

0

あなたが設定する必要があり、ボタンのID(button.id =)、あなたはこれは私がそれを行うだろうかある

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

    } 
} 
+0

ボタンを削除するのではなく、ボタンが含まれている穴のカスタムクラスを削除します。 – masi

0

することによって、それらを指し示すことができるボタンを作成するとき、私はLAS_VEGASユーザ、 に同意します。私は単純な配列の代わりに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 
} 
+0

私はそれが役立つかどうか分かりません。私が言ったように、基本的にはxmlからレイアウトを取得するためにinflateメソッドを使用する単純なJavaクラスのインスタンスです。ホールクラスをビューにするのですか?または型を検索する必要がありますか?もしそうなら、ビューのリファレンスだけでなく、型への参照を取得するにはどうすればよいですか? – masi

+0

私はあなたのカスタムオブジェクトがViewを拡張していると思っていました。まあ、それがカスタムオブジェクトの場合は、それを識別するための何らかの方法が必要ですが、IDフィールドを持たないのはなぜですか?私は私の例をカスタム(ビューではない)に改名しましたが、アイデアは同じです... – Guillaume

+0

また、あなたの質問にいくつかのコードを追加した場合、具体的な助けを得ることはずっと簡単になります – Guillaume

関連する問題