2016-01-21 62 views
2

我得到了多個背後相同的邏輯。將顯示OnClick Variable-Details。我試圖在一個方法中總結它們,並嘗試用Loop來將它們添加到OnCreate方法中。但它沒有奏效。現在我有8位聽衆,並且還有的8 addListener有沒有辦法將多個OnClickListener彙總到AndroidStudio中的一個函數中?

有沒有更優雅的方式?

private void addListenerCal1Arrow() { 
     ivCalArrow1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (!cal1Clicked) { 
        cal1Clicked = true; 
        ivCalArrow1.setImageResource(R.drawable.arrow_symbol_up); 
        tvDescription1.setVisibility(View.VISIBLE); 
       } else { 
        cal1Clicked = false; 
        ivCalArrow1.setImageResource(R.drawable.arrow_symbol_down); 
        tvDescription1.setVisibility(View.GONE); 
       } 
      } 
     }); 
    } 

更多的解釋: 我得到了一個試驗片段,在那裏我可以添加8個變數最大。每個變量都有幾個textview,還有一個ImageView,它包含有關變量的更多信息。當ImageView被點擊時它應該顯示信息。我得到了一個容器類保持變量的所有的部件,如textviews和ImageView的並且還描述當其點擊

,其應顯示
+0

請向我們展示您的代碼。 –

+0

'總結'到哪個級別?對8個圖像使用1'onClick()'方法?重構邏輯的實現以使其對於所有8個圖像是通用的?我們需要查看代碼,如果它們完全相同 - 就像你說的那樣 - 發佈onClick()方法的內容並簡要說明它的作用 – Yazan

+0

@JörnBuitink對於我的糟糕解釋感到抱歉。這是我的第一個問題。我添加了第一個OnClickListener的代碼。爲了更好的理解: 我得到了一個實驗片段,我可以在其中添加8個變量max。每個變量都有幾個textview,還有一個ImageView,它包含有關變量的更多信息。當ImageView被點擊時它應該顯示信息。我收到了一個容器類,其中包含變量的所有小部件,如textviews和imageview,以及點擊時顯示的描述 –

回答

1

有2級到summrize此代碼

1-使用1的onClick()的所有ImageViews:這涉及

1.A實施OnClickListener和不使用anonymous inner class 讓你的活動或片段implements OnClickListener並覆蓋onClick()

public class MyActivity extends Activity implements OnClickListener { 
    //class implementation 


    @override 
    public void onClick(View view){ 
    } 
} 

使用this作爲OnClickLister爲方法setOnClickListener()

ivCalArrow1.setOnClickListener(this);//this here refers to MyActivity 
ivCalArrow2.setOnClickListener(this);//this here refers to MyActivity 
//and so on ... 

灣認識點擊源(其中的ImageView)所產生的動作) 則需要基於該比較視圖id與8個ImageViews ID和執行正確的代碼:

@override 
public void onClick(View view){ 
    if(view.getId() == ivCalArrow1.getId()){ 
     //do what needed on ivCalArrow1 
    }else if(view.getId() == ivCalArrow2.getId()){ 
     //do what needed on ivCalArrow2 
    } 
    //and so on ... for 3 4 5 6 7 8 
} 

2-使onClick()一般處理click正確:這涉及使用數組而不是單個變量命名爲1 2 3,如cal1Clickedcal2Clicked ...或tvDescription1,tvDescription2 ...

這可以通過多種方式來完成,也可能是複雜的理解和維護,所以儘量做到明確

你可能需要一個地圖,ImageView.getId關鍵和一定的價值基礎上,你需要什麼

例如, 布爾變量calXClicked可以是你可以使用一個HashMap,該爲礦灰的標識符和boolean用於點擊編輯狀態 從我的理解爲cal1Clicked標識符是ImageView的本身ivCalArrow1這樣:

聲明這個類範圍的

HashMap<int, boolean> calClickedStatus = new HashMap(); 

一個在onCreate()補充一點:

//assuming all boolean values are false on first create of activity 
calClickedStatus.put(ivCalArrow1.getId,false); 
calClickedStatus.put(ivCalArrow2.getId,false); 
calClickedStatus.put(ivCalArrow3.getId,false); // and so on 
現在

在的onClick( )您將使用view.getId作爲查找所需的其他數據的關鍵 無需查找點擊來源是什麼,因爲您將使用鍵查找它(vi ew.getId)

@override 
public void onClick(View view){ 
    if (!calClickedStatus.get(view.getId())) { 
     calClickedStatus.put(view.getId(), true); 

     //the view here is actually the clicked ImageView, so just cast it and use it, replace this 
     //ivCalArrow1.setImageResource(R.drawable.arrow_symbol_up); 
     //with this 
     ((ImageView)view).setImageResource(R.drawable.arrow_symbol_up); 

     //now for this, you may want to use an array of TextView to hold tvDescription1, tvDescription2 ... 
     //and make a map to link each tvDescriptionX to the index of licked image 
     tvDescription1.setVisibility(View.VISIBLE); 
    } else { 
     //do same changes here too 
     calClickedStatus.put(view.getId(), false); 
     ivCalArrow1.setImageResource(R.drawable.arrow_symbol_down); 
     tvDescription1.setVisibility(View.GONE); 
    } 
} 

正如我剛纔所說,這可能是複雜的,可能很難解釋 並且它可以在5月的方式來完成,所以這只是指導您的概念,剩下的就你

+1

謝謝您的詳細解答。我想我的想法背後是你的方法。我已經拿到了你正在談論的地圖,我只是忘了提及它。我會讓你知道我是否可以成功實現這一點。非常感謝 ! –

+0

我最深切的感謝,你倖免於我150行代碼。它很適合你的方法。你正在討論的HashMap已經以代碼的形式存在於我的代碼中,它包含了一個變量(實驗變量)(layout,textviews,edittext,imageview)的所有小部件。也許你可以幫我解決另一件我想改變的事情。按照現在的情況,我爲每個實驗變量單獨聲明瞭所有小部件。所以我有8 * 6小部件。有沒有辦法來聲明一個示例,並且每次添加一個新的實驗變量時自動創建一個新對象?' –

+0

很好聽,我不是很確定我明白你需要什麼,但是一個相同的重複佈局(textviews,buttons ...等),這大部分可以使用ListView和一個自定義適配器來實現,如果它適合你,同時,如果它滿足你的問題,接受這個答案是很好的:) – Yazan

1

你可以在你的佈局定義每個查看以下內容:

android:onClick="myClickFct" 
android:clickable="true" 

,並在其中加載的佈局方法的類:

public void myClickFct(View view){ 

     ... 

} 
+0

發佈到錯誤的答案:) –

+0

lonescu: 哦,我的壞。但是,謝謝你的想法解決問題:) –

相關問題