【问题标题】:Passing views from abstract activity从抽象活动中传递视图
【发布时间】:2017-01-28 20:00:56
【问题描述】:

我正在尝试将一些视图从抽象 ClassB 传递给 ClassA,以便 ClassA 可以使用:ClassA extends ClassB

我不想对每个视图都使用类似的东西来继承/传递:

protected View getView1() {
    return view1;
}

我想要一种批量方式让 ClassX(在本例中为 ClassA)知道它应该使用哪些视图。但保留一些视图私有给 ClassB 自己使用。

下面的代码确实有效,但可以这样做吗?还是有更好的方法?

public abstract class ClassB extends Activity {

    abstract void useTheseViews(View view1, View view2);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        View view1 = findViewById(R.id.view1);
        View view2 = findViewById(R.id.view2);
        useTheseViews(view1, view2);

        View view3 = findViewById(R.id.view3);
        view3.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 // do something independent here
             }
         });
    }
}

public class ClassA extends ClassB {

    private View view1, view2;

    @Override
    void useTheseViews(View view1, View view2) {
        this.view1 = view1;
        this.view2 = view2;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            view1.setOnClickListener(..);
            view2.setOnClickListener(..);
    }
}

原因? ClassA 和 ClassX 使用相同的基本布局,但在相同的视图上执行不同的功能。

我的 ClassB 拥有一个基本布局并初始化视图(按钮、开关......),并为自己使用一些视图,而不管它扩展了哪个类。

【问题讨论】:

  • 为什么不直接使用片段呢?这是编写活动的更好方式。
  • 如果您展示一些屏幕截图或每个屏幕的模型,这将有助于我们更好地了解您在做什么。正如 Anix 所提到的,使用 Fragments 而不是活动可能会更好。
  • 使用 Fragments,您可以以模块化的方式编写您的 Activity,使用继承,您可以使用分层的方式编写您的 Activity,我看不出 Fragment 将如何解决这里的问题

标签: java android inheritance abstract-class


【解决方案1】:

我会这样做

public abstract class ClassB extends Activity {

    private View view1, view2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        view1 = findViewById(R.id.view1);
        view2 = findViewById(R.id.view2);

    }

    protected View getView1(){
        return view1;
    }

    protected View getView2(){
        return view2;
    }
}

public class ClassA extends ClassB {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getView1().setOnClickListener(..);
        getView2().setOnClickListener(..);
    }
}

如果您不想为每个视图创建受保护的 getter,请使用持有者类

public abstract class ClassB extends Activity {

    protected class ViewHolder {

        public final View view1, view2;

        public ViewHolder(){
            view1 = findViewById(R.id.view1);
            view2 = findViewById(R.id.view2);
        }
    }

    private ViewHolder viewHolder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewHolder = new ViewHolder();

    }

    protected ViewHolder getViewHolder(){
        return viewHolder;
    }
}

public class ClassA extends ClassB {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getViewHolder().view1.setOnClickListener(..);
        getViewHolder().view2.setOnClickListener(..);
    }
}

我建议的方式似乎与 OOP 一致,而且,如果您说 ClassA 和 ClassB,我会假设 ClassA 扩展了 ClassB。如果你想创建一个扩展 ClassA 的第三个类会发生什么?

【讨论】:

  • 此类问题最好用 Fragments 解决,如果 Fragments 不存在,我会同意你的回答。
  • 随意发布答案,展示您将如何使用片段解决
猜你喜欢
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多