在类中设置“this”
Posted
技术标签:
【中文标题】在类中设置“this”【英文标题】:Set "this" in a class 【发布时间】:2014-10-12 17:30:10 【问题描述】:已编辑帖子
我正在尝试为 android 做某种 MVC,但很多教程使用 Activity
作为 View。我会使用Activity
作为控制器。
为此,我必须创建自己的类来扩展View
类。简单的部分是当 Controller 是 Activity
因为我可以做这样的事情:
public class MyView extends View
public MyView(Activity activity)
activity.setContentView(R.layout.my_view);
现在,问题是当 Controller 是 Fragment
时,因为我不能使用 setContentView()
方法。对于片段,您必须在 onCreateView()
方法中对 View
进行膨胀。现在,我这样实现这个方法:
public class MyFragment extends Fragment
private MyView myView;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
myView = MyView.load(container.getContext);
return myView;
MyView
类看起来像这样:
public class MyView extends FrameLayout
static public MyView load(Context context)
return (MyView) inflate(context, R.layout.my_fragment, new MyView(context);
public MyView(Context context)
super(context);
(它扩展了FrameLayout
,因为inflate()
方法使用ViewGroup
作为参数,而FrameLayout
扩展了ViewGroup
,它很容易使用。)
现在,我的问题是:
你有更好的主意来设置片段的内容吗?不使用addView()
方法,可以在MyView
类的构造函数中设置片段的内容吗?
原帖 与其解释我的问题,不如在这里我想做的:
public class MyView extends View
public MyView(View v)
this = v;
但是,不幸的是,这是未经授权的,因为您无法设置“this”关键字。 所以,现在,我正在做类似的事情:
public class MyView extends FrameLayout
public MyView(Context context, View v)
super(context);
addView(v);
它有效,但我不太喜欢这个解决方案,因为您必须将 ID 和来自视图“v”的所有内容设置为这个新视图(例如 this.setId(v.getId);
等)...
你有更好的主意来做我想做的事吗?
【问题讨论】:
解释你的问题会更好,很难理解 这是不可能的。 当然可以,给我第二个 OP,我正在写答案 "你有更好的主意来做我想做的事吗?"你还没有真正解释你想要达到的目标,只是你到目前为止所采取的方法。退后一步,描述一下您开始查看此内容的最初原因。 您应该完成一些介绍性的 OOP 和 Java 教程。如果你不明白为什么不能分配this
,那么你还没有准备好构建应用程序。
【参考方案1】:
只需创建一个可以为您完成所有这些工作的方法。
我不知道 View 类的所有属性,但假设您的属性是 ID、Name 和 Number,每个都有自己的 getter 和 setter...
public void transferInfo(View v)
this.setID(v.getID());
this.setName(v.getName());
this.setNum(v.getNum());
这样,您可以编辑视图的所有功能,而不会丢失任何信息。现在,这是一个非常通用的示例,请确保您对其进行编辑,以便引入原版的所有功能。
【讨论】:
您的意思是“属性”,而不是“实例”;从上下文来看,意思很清楚,但由于“实例”在 OOP 中意味着非常具体的东西,所以您可能希望避免误用它。 这里的问题是您必须确切地知道要保留哪些属性。我只想将View v
设置为MyView
类的根视图。以上是关于在类中设置“this”的主要内容,如果未能解决你的问题,请参考以下文章