【问题标题】:How to use a view generated from another class?如何使用从另一个类生成的视图?
【发布时间】:2012-06-25 14:38:56
【问题描述】:

AOSP 4.0.4 中的 expand_status_bar 布局有一个 TextView,在 XML 中看起来像这样

<com.android.systemui.statusbar.policy.DateView
    android:id="@+id/date"
    android:textAppearance="@style/TextAppearance.StatusBar.Date"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="4dp"
    android:singleLine="true"
    android:gravity="center"
    android:visibility="visible" />

由“frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java”生成

它被“frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java”夸大了,如下所示:

ExpandedView expanded = (ExpandedView) View.inflate(context, R.layout.status_bar_expanded, null);
// stuff here
mDateView = (DateView) expanded.findViewById(R.id.date);

我想通过另一个类设置它的可见性,我已经尝试了一些我在这里读到的东西,但都没有运气。我尝试的最后一件事是,在我的班级(也是 systemui 的一部分)中添加以下内容:

TextView mDateView = (TextView) findViewById(R.id.date);
mDateView.setVisibility(View.GONE);

但是,在我的班级中,mDateView 为空。有什么我想念的吗?我一直在寻找几个小时并在这里和那里尝试一些东西,但没有任何效果。我拥有中级 Java 技能,但我仍在努力拥抱来自 20 年过程语言的 OOP 事物。提前致谢。

我将 mDateView 的定义更改为如下所示:

private DateView mDateView;
DateView mDateView = (DateView) findViewById(R.id.date);

但我仍然将 mDateView 设为 null :(

【问题讨论】:

  • DateView 类是否扩展了 ExpandedView?
  • 您好,我误解了您的问题,解决方案是在您夸大视图的类中添加方法。
  • 一种设置视图不可见的方法。
  • Dheeresh:在 DateView.java 我有“public final class DateView extends TextView {”,在 PhoneStatusBar.java 我有“ExpandedView expand = (ExpandedView) View.inflate(context, R.layout.status_bar_expanded , 空"
  • 我试过 iNan 但我仍然得到 mDateView 为空。让我找到源的链接。也许我把它放在了错误的位置。

标签: android view


【解决方案1】:

最初我误解了您的问题,您可以在一个类中添加方法并通过另一个类访问它。

public static void hideDateView() {
        mDateView.setVisibility(View.GONE);
    }

您可以在PhoneStatusBar.java 中添加以下方法并稍后调用。

【讨论】:

  • @gdanko 我有一个疑问是 DateView 扩展 ExpandedView 类?
  • 我不这么认为,我有点懒得输入findViewById 我只是从上面复制的:D
  • 没有。 mDateView 仍然为空 :(
【解决方案2】:

我可以看到你有两个问题:

1) 您需要将拥有您的ViewContext 传递给您要在其中使用视图的类。

假设ContextActivity,那么您将使用activity.findViewById(R.id.date)

2) 如果你要使用findViewById(R.id.date),你需要确保你已经以某种方式将视图添加到你的视图层次结构中(膨胀它不会这样做,除非你特别告诉它)。 inflate() 函数通过传入父视图而不是 null 后跟一个额外的布尔参数来指定是否应将膨胀视图添加到父视图,从而提供了一种方法。

或者,您可以在现有的 inflate 调用之后说 parentView.addView(expanded)

【讨论】:

  • 我尝试在 PhoneStatusBar.java 中创建一个公共方法,因为它是使视图膨胀的类。它类似于: public void hideDateView(Context c) { mDateView.setVisbility(View.GONE); } 但我会得到一个 NPE 说明 mDateView 为空。我可能把方法放在了错误的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多