2017-01-28 10 views
0

Я пытаюсь передать некоторые взгляды ClassA от абстрактного ClassB, так что 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 используют один и тот же базовый макет, но выполняют разные функции на одних и тех же представлениях.

My ClassB имеет базовый макет и инициализирует представления (кнопки, переключатели ..) и использует некоторые представления для себя независимо от того, какой класс расширяет его.

+1

Почему бы вам просто не использовать фрагменты? Это лучший способ составить свою деятельность. – AnixPasBesoin

+1

Это поможет нам лучше понять, что вы делаете, если вы показываете скриншоты или макеты каждого экрана. Как упоминала Аникс, лучше было бы использовать Фрагменты вместо Деяний. –

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

и если вы не хотите, чтобы создать защищенный поглотитель для каждого вида, использовать класс держателя

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