首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android overriding (View v) -有没有一个很好的解决方案可以用于应用程序中的所有按钮

Android overriding (View v) -有没有一个很好的解决方案可以用于应用程序中的所有按钮
EN

Stack Overflow用户
提问于 2012-03-10 04:09:54
回答 2查看 7K关注 0票数 0

正如您所知道的,我们可以为我们创建的每种类型的View覆盖一些方法。我不会编写任何xml布局代码,因为很多东西都会在运行时更改表单,还有一些东西是动态创建的,所以编程解决方案是我在这里的最佳选择。

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

我已经创建了一个名为CustomButton的按钮类,它覆盖了onClick(View view)方法。如果一些按钮应该做一些动作(假设它们是线性布局的一部分),而另一些按钮是相对布局的一部分,并且在每个相对布局中,你想要获得关于这个按钮所在的相对布局的信息(也许你想要获得关于同一相对布局中所有文本视图的信息,等等)。

当然,一种解决方案是,您可以获取每个按钮的ID,并执行切换(Case)或其他操作,然后根据返回的按钮的ID,您可以执行一些操作。问题是我有50个按钮。如果我有200个呢?我真的需要在switch语句中执行200次case检查才能确定需要采取什么操作吗?

因此,我正在尝试找出在重写onClick时可以使用哪些我不知道的信息。

代码语言:javascript
复制
   @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个If -正如我所指出的,您可能会有数百个按钮。

我想知道有没有人有什么想法比在switch语句中使用无限的case检查更好。如果我能找出按钮来自哪个视图(在我的例子中,按钮是外部视图的一部分),那么我就可以在我的视图上进行切换,而不仅仅是我的按钮-这样我的switch语句就不那么麻烦了,也更容易维护。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-10 04:26:36

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

例如:

代码语言:javascript
复制
@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。

希望能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2012-03-10 04:26:29

如果我没理解错的话,您可以简单地使用几个不同的CustomButton扩展:比如RelativeLayoutButtonLinearLayoutButton,然后让它们实现OnClickListener。重写扩展类中的onClick(),并按Button类型处理实现。

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

代码语言:javascript
复制
//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));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9640308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档