【问题标题】:findViewById(R.id.something) in a non-activity class非活动类中的 findViewById(R.id.something)
【发布时间】:2013-04-15 07:59:06
【问题描述】:

在我的活动中,我通过一堆控件(输入字段),并创建一个

for(ControlTemplate field: fieldMap.get(string))
{
    View view = field.getFieldControl(true, this);
    l.addView(view, new PredicateLayout.LayoutParams(2, 0));
}

ControlTemplate 的 getFieldControl 包含一个 switch 语句,它应该返回不同类型的视图。

  case LABEL:                       
        view = new TextView(context);
        view.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        ((TextView) view).setText(value);
  break;

但是,我希望能够从 xml 定义创建视图,但这是不可能的,因为该类没有活动,因此它没有布局。我想做的是这样的:

case TEXTBOX:   
    view = (EditText) passedActivity.findViewById(R.id.edit_message);
break;

其中passedActivity 是创建ControlField 类的活动。有没有办法将当前活动作为参数传递,或者可能只传递其布局资产?

【问题讨论】:

  • 将上下文传递给非活动类构造函数并使用它来查找id。
  • @Raghunandan 有什么区别?
  • 我已经通过了上下文,但是如何从上下文中获取id呢?
  • 如果您有上下文,那么您可以扩充视图,并且可以在该视图上使用 findviewById 来获取其子视图。
  • 如果你在不同的班级,我相信你可以导入 R。

标签: android android-layout layout user-interface


【解决方案1】:

使用LayoutInflater 加载布局资源

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

view = mInflater.inflate(R.layout.edit_message, parent, false);

inflate 的参数见this

public View inflate (int resource, ViewGroup root, boolean attachToRoot)

参数

resource

要加载的 XML 布局资源的 ID(例如,R.layout.main_page)

 root

作为生成层次结构的父级的可选视图(如果 attachToRoot 为 true),或者只是为返回的层次结构的根提供一组 LayoutParams 值的对象(如果 attachToRoot 为 false。)

attachToRoot

膨胀的层次结构是否应该附加到根参数?如果为 false,则 root 仅用于为 XML 中的根视图创建正确的 LayoutParams 子类。

【讨论】:

  • 这似乎可行!作为父参数我应该传递什么?
  • 将活动上下文传递给非活动类的构造函数 new NonActivityClass(ActivityName.this);然后使用相同的方法扩展布局并找到所需视图的 id。
【解决方案2】:

如果您将 Activity 中的上下文传递给您的其他类,则可以遍历上下文以获取所需的一切。您应该能够从上下文以及相关视图中获取 R。

【讨论】:

    【解决方案3】:

    如果我正确理解了您的问题,您需要将活动的上下文传递给 ControlTemplate 类。

    例如 我发送 this(当前上下文)。

    adapter = new ChecklistBaseAdapter(this, checklistitems);
    

    当调用我的基础适配器类时

    public ChecklistBaseAdapter(Context context, ArrayList<Checklist> results) 
    

    然后我可以使用我的 ChecklistBaseAdapter 类引用对当前活动的更改控件。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多