2016-01-21 39 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: 哦,我的坏。但是,谢谢你的想法解决问题:) –

相关问题