Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从抽象活动传递视图_Java_Android_Inheritance_Abstract Class - Fatal编程技术网

Java 从抽象活动传递视图

Java 从抽象活动传递视图,java,android,inheritance,abstract-class,Java,Android,Inheritance,Abstract Class,我试图将一些视图从抽象的ClassB传递给ClassA,以便ClassA可以使用:ClassA扩展ClassB 对于我希望继承/传递的每个视图,不要使用类似的方法: protected View getView1() { return view1; } 我想要一种批量方式让ClassX在这种情况下,ClassA知道它应该使用哪些视图。但是将一些视图保留为ClassB私有,以便自己使用 下面的代码确实有效,但这样做可以吗?还是有更好的办法 public abstract class Cl

我试图将一些视图从抽象的ClassB传递给ClassA,以便ClassA可以使用:ClassA扩展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拥有一个基本布局,初始化视图按钮、开关..,并为自己使用一些视图,而不管是哪个类扩展它。

我会这样做

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,请使用holder类

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的第三个类,会发生什么情况?

为什么不使用片段呢?这是一种更好的方式来撰写您的活动。如果您显示每个屏幕的一些截图或模型,这将帮助我们更好地了解您正在做什么。正如Anix提到的,使用片段而不是活动可能更好。使用片段,您以模块化的方式编写活动,使用继承,您以分层的方式编写活动,我看不出片段如何解决此处的问题这些问题最好使用片段解决,若并没有碎片,我会同意你们的答案。请随意发布答案,展示你们将如何用碎片解决问题