2017-01-28 4 views
0

私はにClassAが使用できるように、抽象ClassBのからにClassAにいくつかのビューを渡すためにしようとしている:ClassA extends ClassB渡す景色

代わりの各ビューのためにこのようなものを使用して、私は継承されしたいです/私はClassX(この場合、A級では)それを使用する必要があります見ている知っているようにするバルク方法をしたい

protected View getView1() { 
    return view1; 
} 

:に渡されました。しかし、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

これは、各画面のスクリーンショットやモックアップを表示すると、自分が行っていることをよりよく理解するのに役立ちます。 Anixが述べたように、アクティビティの代わりにフラグメントを使用するほうが良いかもしれません。 –

+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を拡張する第3のクラスを作成したい場合はどうなりますか?

+0

この問題はフラグメントで解決するのが望ましいでしょう。もしフラグメントがなければ答えてください。 – AnixPasBesoin

+0

フラグメントを使って解決する方法を示す回答を自由に投稿できます – lelloman