【问题标题】:How can I access an object (e.g. ArrayList) from another class?如何从另一个类访问对象(例如 ArrayList)?
【发布时间】:2011-12-07 22:37:14
【问题描述】:

我正在寻找一种允许我从另一个类访问对象的方法; 两个类都在同一个 Android 活动中 - OpenStreeMapActivity.java。我有:

ItemizedOverlay.java - 包含我要访问和修改的对象:

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

BalloonOverlayView.java - 是我要访问对象 mOverlays 的地方:

    protected void setupView(final Context context, final ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inflater.inflate(R.layout.balloon_overlay, parent);
    title = (TextView) v.findViewById(R.id.balloon_item_title);
    snippet = (TextView) v.findViewById(R.id.balloon_item_snippet);

    // Get ballon_close button and register its listener:
    ImageView close = (ImageView) v.findViewById(R.id.balloon_close);
    close.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            parent.setVisibility(GONE); 

            Intent intent = new Intent( );
            intent.setClassName( "org.example.openstreetmap", "org.example.openstreetmap.UpdateEntityActivity" );
            v.getContext().startActivity(intent);

            //HERE I return from UpdateOverlayActivity.java and is where I want to modify *mOverlays*.
        }
    });

} 

编辑:我发现我返回 //HERE 是不正确的。

【问题讨论】:

  • 你不能将对象 mOverlays 作为方法 setupView 的参数传递吗?如果没有,您仍然可以在调用 setupView 之前将其分配给 BalloonOverlayView 类的公共属性,对吧?

标签: java android class object android-activity


【解决方案1】:

在 ItemizedOverlay 中,创建一个提供对象的方法。

public List<OverlayItem> getOverlays() {
  return this.mOverlays;
}

如果您使用 List 会更好,因此,如果您将来想要更改实现,它不会影响您在其他地方的代码。

【讨论】:

  • 您是在建议我将 Arraylist 更改为 List 吗?如何在其他类中调用 getOverlays?
  • this.mOverlays 仍然可以是 ArrayList。但是在公开数据时,将其指定为更通用的超类/接口可以让您在需要时更轻松地替换它(如果您在某个时候决定使用自己的 List 实现而不是 arraylist,则不需要在 ItemizedOverlay 之外进行任何更改)。关于另一个问题,显然您需要获取对要调用的对象的引用;您将需要以类似的方式将引用传递给调用类。这是基本的 Java,如果你对它有困难,在进入 android 之前用基本的控制台程序测试它
  • 你是对的,private List&lt;OverlayItem&gt; mOverlays = new ArrayList&lt;OverlayItem&gt;();private ArrayList&lt;OverlayItem&gt; mOverlays = new ArrayList&lt;OverlayItem&gt;(); 更受欢迎。另外,我明白了,我应该从另一个类中引用我想要操作的对象。谢谢。顺便说一句,我喜欢你的昵称,它记得我圣胡安,PR。
【解决方案2】:

您可以通过这种方式使BalloonOverlayView 持有对OverlayItem 对象列表的引用:

public class BalloonOverlayView{
 List<OverlayItem> items = null;
 public BalloonOverlayView(List<OverlayItem> items){
    this.items = items;
 }
 // Now you can use the ItemizedOverlay class from within this class as you wish
 public void addItem(OverlayItem item){
    items.add(item);
 }
 public void removeItem(OverlayItem item){
    item.remove(item);
 }
}

【讨论】:

  • 你的建议给了我(e.g. items.getItem() )的项目,但它不允许我做items.add(overlay)items.remove(inDrag)之类的事情。
  • 我添加了 public void addItem(Item item) { items.add(item); } 但现在我收到一条错误消息:“对于 ItemizedOverlay 类型,方法 add(Item) 未定义”。
  • @kako13 很高兴它成功了,请不要忘记 +1 并接受这个作为你问题的答案:)
猜你喜欢
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多