【问题标题】:Android overriding onClick(View v) - is there a good solution to use for all buttons in an applicationAndroid 覆盖 onClick(View v) - 是否有一个很好的解决方案可用于应用程序中的所有按钮
【发布时间】:2012-03-10 04:26:35
【问题描述】:

如您所知,我们可以为我们创建的每种视图类型覆盖一些方法。我没有做任何 xml 布局代码,因为很多东西在运行时会改变形式,并且有些东西是动态创建的,所以编程解决方案是我在这里的最佳途径。

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

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

当然,一种解决方案是您可以获取每个按钮的 ID 并执行开关(大小写)或其他操作,并且根据返回的按钮的 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");


    }

}

所以这里是一个例子。我已经传入了代表被单击按钮的视图,当我一遍又一遍地单击它时,我可以更改按钮的文本。但是如果 Button 是相对布局的一部分呢?我能否获得有关也属于同一相对布局的其他视图的任何其他信息?如果某些按钮我想更改每次单击时的背景颜色而不是更改文本怎么办?如果我有 X 个按钮,我会尽量避免创建 X 个 ID——正如我指出的那样,你可能有数百个。

想知道是否有人对这里有什么比在 switch 语句中进行可能无限的大小写检查更好的方法有任何想法。如果我能找出按钮来自哪个视图(在我的情况下,按钮是外部视图的一部分),那么我可以对我的视图进行切换,而不仅仅是我的按钮 - 并使我的 switch 语句变得不那么繁琐和更容易维持。谢谢。

【问题讨论】:

  • 你能用几句话准确地说出你想做的事吗?你的解释不清楚!
  • 我不知道我是否了解您要做什么(尤其是您要收集的额外信息),但您可以在 Button 上设置 tag 属性(在xml 布局)表示 String 并基于该 String 获取有关 Button 上下文的更多信息。
  • 请看下面对 YuviDroid 的回答。很抱歉最初的混乱。

标签: android onclick android-button onclicklistener


【解决方案1】:

我不确定您的最终目标是什么。但是从您的视图(按钮)中,您可以获得其父级(例如,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。

希望对你有帮助。

【讨论】:

  • 是的,我意识到我可能没有我想的那么清楚。显然情况就是这样,因为我得到了多个答案,想知道我在说什么。就我而言,我有相对布局的线性布局。在每个相对布局中,我都有一个按钮和一些其他视图(文本视图)。当我单击这些按钮中的任何一个时,我希望能够获取位于相同相对布局中的文本视图之一的文本值。根据此按钮所在的相对布局,getText 调用的值会有所不同。
  • ..继续 - 如果我可以按照您上面的建议进行操作,那么我不必为每个我想要远离的按钮分配按钮 ID。在您上面建议的相对布局的情况下,我认为这本身会很好。如果我有 5 个线性布局,并且在每个线性布局中我有 5 个按钮会怎样。如果我检查按钮是否是线性布局的一个实例,在这种情况下,它不会提供足够的信息,因为每个线性布局中的每组按钮都会发送不同的操作,我想要实施。
  • --继续。我可能会得到线性布局的名称,让我知道我可能想采取什么行动,但如果我有类似 ArrayList myLinearLayouts = new ArraysList(some number) - 那么我将不得不检查数组在 switch 语句中对检查进行索引和硬编码。无论如何,只是试图找到最优雅的面向对象的方法。感谢您的意见 Yuvi。
【解决方案2】:

如果我的理解正确,您可以简单地使用几个不同的 CustomButton 扩展:比如 RelativeLayoutButtonLinearLayoutButton,并让它们实现 OnClickListener。在扩展类中覆盖 onClick(),并处理每个 Button 类型的实现。

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

//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));
}

【讨论】:

  • 我想你和 Yuvi 都知道我想做什么。请参考我上面的回复。一旦我发现我正在使用什么样的实例(RelativeLayout、LinearLayout 等的实例),我会很高兴找出我在构建它们时最初为它们分配的布局的变量名称......即myLinearLayoutCars、myLinearLayoutAnimals、myRelativeLayoutA、myRelativeLayoutB 并且可能使用 switch 语句来检查我拥有的不同“种类”的线性或相对布局。这样做的原因是,正如我之前试图解释的那样不善言辞......
  • 是不同的线性布局或相对布局将在其中具有不同的视图类型(子视图)和不同的数量。因此,取决于我拥有的布局“类型”(通过布局变量名称检查?)将取决于我要提取的视图类型。在 RelativeLayoutA 的情况下,这个特定类型有一个图像视图、2 个文本视图和我点击的相关按钮。如果我知道我点击了 RelativeLayoutA 的父级,那么我想以某种方式提取特定的 textView(也按名称?)。无论如何,我希望这不会太混乱......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
相关资源
最近更新 更多