2016-04-09 9 views
0

私はカスタムカレンダーを作成しています。私のカレンダーは、各ボタンのonClickリスナーを含む毎日のボタンを含むグリッドビューです。それぞれには日付を表すタグがあります。Android:タグでビューのリストを取得して特定のボタンを変更する

私は最初、私は一致するすべてのビューを取得しています、だから、特定のタグ(日付)によるレイアウトのボタンを見つけ、その後、(太字にその内容を変更する)ことで動作するように

を必要としていますタグ(イベント日付):

/** 
* Get all the views which matches the given Tag recursively 
* http://stackoverflow.com/questions/9920559/how-to-find-list-of-views-that-has-a-specific-tag-attribute 
* @param root parent view. for e.g. Layouts 
* @param tag tag to look for 
* @return List of views 
*/ 
public static List<View> findViewWithTagRecursively(ViewGroup root, Object tag){ 
    List<View> allViews = new ArrayList<View>(); 

    final int childCount = root.getChildCount(); 
    for(int i=0; i<childCount; i++){ 
     final View childView = root.getChildAt(i); 

     if(childView instanceof ViewGroup){ 
      allViews.addAll(findViewWithTagRecursively((ViewGroup)childView, tag)); 
     } 
     else{ 
      final Object tagView = childView.getTag(); 
      if(tagView != null && tagView.equals(tag)) 
       allViews.add(childView); 
     } 
    } 

    return allViews; 
} 

次は私が大胆

Log.d(tag, "calendarFormatdate "+eventDate); 
List gridcells = findViewWithTagRecursively(calendarView, eventDate); 

if (gridcells.size() == 1) { 
    Button gridcellButton = gridcells.get(0); //this doesnt work(required Anroid.Widget.Button - FOUND Java.Lang.Object 
    //Object gridcellbutton = gridcells.get(0); //this works but cannot assign it to Button object 
    } 
アンクル

私はそのテキストをそのビューからボタンを作成しようとしていますボタンとJavaオブジェクトが異なっていることを確認してください。ですが、このオブジェクトをボタンに変換して表示する方法はありますか?オブジェクトgridcellBUtton値は以下の通りです:

renaldyalisys D/GridCellAdapter: object value android.widget.Button{eb9b3a4 VFED..C. ........ 0,0-68,72 #7f0c00bc app:id/calendar_day_gridcell} 
+0

あなたの質問であまりにも多くのことが起こっています。私はあなたの問題を示すために必要最小限の本質に戻すことをお勧めします。 –

+0

あなたの答えをありがとう、私はコードを変更します –

+0

@BasilBourque編集 –

答えて

0

instanceof

私は、Androidのプログラマーではないけど、あなたの質問には基本的なJavaの問題であるように見えます。あなたは言っていますか:

私はオブジェクトがスーパークラスObjectとして返されています。しかし、私は実際にオブジェクトがButtonクラスのインスタンスであることを知っています。私はそれを具体的にObjectとしてではなく、具体的にはButtonと呼ぶことができますか?

もしそうなら、単にオブジェクトをキャストします。より一般的なスーパータイプからより特定のタイプへ行くのはdowncastingです。

Object o = gridcells.get(0) ; 
Button b = (Button) o ; 

または組み合わせ:

Button b = (Button) gridcells.get(0) ; 

かなり確実でない場合は、特別なオペレータinstanceofとのチェックを行います。

if(gridcells.get(0) instanceof Button) { 
    Button b = (Button) gridcells.get(0) ; 
} 

コードで多くのキャストを行っていると、デザインに問題が発生する可能性があります。通常は、オブジェクト指向プログラミングの基礎を理解していないからです。しかし時には、いくつかのキャスティングが順調で、避けられないこともあります。

詳細は、this similar Questionを参照してください。

質問を誤解している場合は、質問を書き直す必要があります。

+0

ありがとうございます。できます! –

+0

@B_C喜んで助けてください。キャスティングと[多型性](https://en.m.wikipedia.org/wiki/Polymorphism_(computer_science))について学んでください。 OOPプログラミングの重要な概念。いったん、あなたはあなたのコーディングのアイデアの非常に実用的なアプリケーションを参照してください素晴らしい言語を取得します。 –

関連する問題