【问题标题】:Set "this" in a class在类中设置“this”
【发布时间】:2014-10-12 17:30:10
【问题描述】:

已编辑帖子
我正在尝试为 android 做某种 MVC,但很多教程使用 Activity 作为 View。我会使用Activity 作为控制器

为此,我必须创建自己的类来扩展View 类。简单的部分是当 ControllerActivity 因为我可以做这样的事情:

public class MyView extends View
{
    public MyView(Activity activity)
    {
        activity.setContentView(R.layout.my_view);
    }
}

现在,问题是当 ControllerFragment 时,因为我不能使用 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,那么你还没有准备好构建应用程序。

标签: java android model-view-controller view


【解决方案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 类的根视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 2011-04-24
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多