2017-01-28 34 views
0

我尝试了一些看法,从抽象的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拥有一个基础布局,并初始化视图(按钮,开关..),并使用一些视图为自己,而不管它是什么类扩展它。

+1

你为什么不使用碎片?这是一个更好的方式来撰写你的活动。 – AnixPasBesoin

+1

如果您显示每个屏幕的一些屏幕截图或模型,它将帮助我们更好地理解您在做什么。正如Anix所提到的,使用Fragments而不是Activities可能会更好。 –

+0

与片段您以模块化方式撰写您的活动,继承您以分层方式撰写您的活动,我不明白片段如何解决问题在这里 – lelloman

回答

0

我会做这样

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(..); 
    } 
} 

,如果你不希望创建保护吸气每个视图,使用一个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(..); 
    } 
} 

我建议的方式似乎如果你说ClassA和ClassB,我会认为ClassA扩展了ClassB。如果你想创建一个扩展ClassA的第三类,会发生什么?

+0

这样的问题最好用碎片解决,我会同意你的如果碎片不在那里,则回答。 – AnixPasBesoin

+0

随时发布答案,以显示你将如何解决碎片 – lelloman