Android覆盖onClick(视图v)-是否有一个好的解决方案用于应用程序中的所有按钮

Android覆盖onClick(视图v)-是否有一个好的解决方案用于应用程序中的所有按钮,android,onclick,android-button,onclicklistener,Android,Onclick,Android Button,Onclicklistener,正如您所知,我们可以为创建的每种类型的视图重写一些方法。我不做任何xml布局代码,因为很多东西在运行时会发生变化,而且有些东西是动态创建的,所以编程解决方案是我在这里的最佳途径 因此,为了了解我的问题的要点,让我们假设我的Android应用程序中有50个按钮。这些按钮可能位于一个活动上,但很可能跨越多个屏幕(活动) 我创建了一个名为CustomButton的button类,它覆盖了onClick(View)方法。如果某些按钮应该执行某些操作(假设它们是线性布局的一部分),而某些按钮是相对布局的一

正如您所知,我们可以为创建的每种类型的视图重写一些方法。我不做任何xml布局代码,因为很多东西在运行时会发生变化,而且有些东西是动态创建的,所以编程解决方案是我在这里的最佳途径

因此,为了了解我的问题的要点,让我们假设我的Android应用程序中有50个按钮。这些按钮可能位于一个活动上,但很可能跨越多个屏幕(活动)

我创建了一个名为CustomButton的button类,它覆盖了onClick(View)方法。如果某些按钮应该执行某些操作(假设它们是线性布局的一部分),而某些按钮是相对布局的一部分,并且在每个相对布局中,您希望获取有关此按钮所在的相对布局的信息,该怎么办(可能您需要了解有关相同相对布局中所有文本视图的信息,等等)

当然,一种解决方案是,您可以获取每个按钮的ID并进行切换(case)或者,根据返回的按钮的ID,您可以做一些事情。问题是我有50个按钮。如果我有200个,会怎么样?我真的应该在switch语句中进行200个案例检查,以确定我需要采取什么操作吗

因此,我试图找出哪些信息对我来说是可用的,而我不知道在重写onClick时可以使用这些信息

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    if(!getClickInfo()){
        ((CustomButton)v).setText("I clicked the button");
        setClickInfo(true);
    }
    else{
        isClicked = false;
        ((CustomButton)v).setText("This is the button that i want to click");


    }

}
下面是一个例子。我已经传入了表示被单击按钮的视图,我可以在反复单击按钮时更改按钮的文本。但是如果按钮是相对布局的一部分呢?我可以获得关于其他视图的任何其他信息吗?如果一些按钮是相对布局的一部分呢我想更改每次单击时的背景色,而不是更改文本?如果我有X个按钮,我会尽量避免创建X个ID——正如我指出的,可能有数百个


我想知道是否有人知道,与在switch语句中进行可能不受限制的关于大小写检查相比,这里有什么更好的方法。如果我能找出按钮来自哪个视图(在我的例子中,按钮是外部视图的一部分)然后,我可以在视图上切换,而不仅仅是切换按钮,这样我的切换语句就不那么麻烦,也更易于维护。谢谢。

如果我理解正确,你可以简单地使用几个不同的自定义按钮扩展名:比如说
RelativeLayoutButton
LinearLayoutButton
,然后将它们发送到im在扩展类中重写
onClick()
,并处理每个按钮类型的实现

如果需要,您可以访问整个视图层次结构。例如:

//assuming a reference to Button button

//get a reference to the parent
View v = button.getParent();
ViewGroup parent;
ArrayList<View> siblings = new ArrayList<>();

if(v instanceof ViewGroup) parent = (ViewGroup) v;
for(int i = 0; i < parent.getChildCount(); i++) {
    siblings.add(parent.getChildAt(i));
}
//假设引用了按钮
//获取对父对象的引用
视图v=button.getParent();
视图组父对象;
ArrayList同级=新的ArrayList();
如果(v instanceof ViewGroup)parent=(ViewGroup)v;
对于(int i=0;i
如果我理解正确,您可以简单地使用几个不同的CustomButton扩展:比如说
RelativeLayoutButton
LinearLayOutatton
,让它们在扩展类中实现OnClickListener.Override
onClick()
,并根据按钮类型处理实现

如果需要,您可以访问整个视图层次结构。例如:

//assuming a reference to Button button

//get a reference to the parent
View v = button.getParent();
ViewGroup parent;
ArrayList<View> siblings = new ArrayList<>();

if(v instanceof ViewGroup) parent = (ViewGroup) v;
for(int i = 0; i < parent.getChildCount(); i++) {
    siblings.add(parent.getChildAt(i));
}
//假设引用了按钮
//获取对父对象的引用
视图v=button.getParent();
视图组父对象;
ArrayList同级=新的ArrayList();
如果(v instanceof ViewGroup)parent=(ViewGroup)v;
对于(int i=0;i
我不确定你的最终目标是什么。但是从你的视图(按钮)你可以得到它的父对象(例如,RelativeLayout)。然后一旦你有了视图组,你就可以得到它的子对象并做任何你需要做的事情

例如:

@Override
public void onClick(View v) {
    ViewParent parent = v.getParent();
    if (parent instanceof RelativeLayout) {
        // your button is inside a RelativeLayout
        RelativeLayout rl = (RelativeLayout) parent;
        int numChildren = rl.getChildCount();
        // loop through children if you need to (use rl.getChildAt(index) to get each child)
        ...
    }
}
如果您不需要知道它实际上是一个RelativeLayout还是LinearLayout,或者其他什么,请使用ViewGroup


希望能有帮助。

我不确定你的最终目标是什么。但是从你的视图(按钮)你可以得到它的父对象(例如RelativeLayout)。然后一旦你有了视图组,你就可以得到它的子对象并做任何你需要做的事情

例如:

@Override
public void onClick(View v) {
    ViewParent parent = v.getParent();
    if (parent instanceof RelativeLayout) {
        // your button is inside a RelativeLayout
        RelativeLayout rl = (RelativeLayout) parent;
        int numChildren = rl.getChildCount();
        // loop through children if you need to (use rl.getChildAt(index) to get each child)
        ...
    }
}
如果您不需要知道它实际上是一个RelativeLayout还是LinearLayout,或者其他什么,请使用ViewGroup


希望有帮助。

你能用几句话准确地说出你想做什么吗?你的解释不清楚!我不知道我是否理解你想做什么(特别是你试图收集的额外信息),但你可以在
按钮上设置
标记
属性(在xml布局中)表示一个
字符串
并基于该
字符串
获取有关
按钮
上下文的更多信息。请查看下面对YuviDroid的回答。对于最初的混淆,很抱歉。你能用几句话准确说出你想做什么吗?你的解释不清楚!我不知道我是否理解你想做什么(特别是您试图收集的额外信息)但您可以在
按钮上设置
标记
属性(在xml布局中)表示一个
字符串
,并基于该
字符串
获取有关
按钮
上下文的更多信息。请查看下面对YuviDroid的回答。对于最初的困惑,很抱歉。是的,我意识到我可能没有我想要的那么清楚。显然,这是因为我得到了多个答案,想知道我在说什么在我的例子中,我有一个相对布局的线性布局。在每个布局中