2017-01-11 5 views
0

私は理解しようとしているコードを持っています。これはJava-Androidベースです。そこにこのコード括弧内で行わ@Override方法で Javaオーバーライドメソッド関数呼び出しの内部

 volumeControl.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
      audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0); 
     } 

    }); 

は、このこのコードを行うための最善の方法であり、これがどのように行われます。

  • このコンストラクタ呼び出しをJavaコンパイラがどのように理解するか。

  • 進捗状況と呼ばれるint変数があり、そこから値を取得する場所、関数呼び出しの仕方を示します。

+1

は匿名クラスを参照してください:https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html – Berger

+0

それは、基本クラスのものをオーバーライドするメソッドを持つ新しいオブジェクトを作成しています。 – Carcigenicate

+0

あなたが求めていることは明確ではありません。あなたは 'setOnSeekBarChangeListener'のパラメータで定義されている匿名クラスについて質問していますか? –

答えて

0

方法は、メソッドがOnSeekBarChangeListenerを実装するクラスであることが期待されます。

volumeControlオブジェクトの内部では、参照はリスナーに保持されます。

volumeControlがリスナーに通知する必要があるときはいつでも、リファレンスを使用してリスナーに通知します。

この特定の例では、Listenerを個別に実装するクラスを作成する代わりに、匿名のインライン実装が提供されています。

これはSwingやAndroid開発でこれを処理する典型的な方法です。それはかなり醜いので、それはいつもそうだった。

幸運なことに、Java 8では関数型プログラミング、ラムダ、そしてより一般的な用語である "関数ポインタ"のおかげで、これに対処する方法がさらに改善されました(ついに!!)。

編集は(まだ、コメントを書き込むことはできません)、コメントへの回答として Function Pointers in Java

+0

Javaは***です。***関数参照を取得していますか? –

+0

呼び出されたオブジェクトはオブジェクトからイメージを格納します。リスナーに通知するたびに、変数arは自動的に何も処理されずに自動的に実行され、その後、変数intの進捗状況はシステムによってアクションが発生したときに設定されます。 –

1

(Javaで)のAndroidのインターフェイスを実装する2通りの方法があります参照してください。あなたと同じ(匿名の実装)したり、クラス署名にimplements OnSeekBarChangeListenerを追加することができます。クラスでインターフェイスを実装すると、これらのメソッドはすべてクラスメソッドになります。次に、クラスインスタンスが必要なインターフェイスを実装しているため、volumeControl.setOnSeekBarChangeListener(this)に電話をかけることができます。

どちらの実装方法でもコードの可読性との違いは他にありません。

しかし、匿名の実装でメソッド変数を使用する場合は、の最後のと宣言する必要があります。

public class SeekBarTestActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener { 

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

     SeekBar seekbar = (SeekBar) findViewById(R.id.seekBar); 
     seekbar.setOnSeekBarChangeListener(this); 
    } 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
     // TODO add your implementation here 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 
     // TODO add your implementation here 
    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     // TODO add your implementation here 
    } 
}
+0

あなたは、匿名の実装よりも読みやすく分かりやすい方法のように見えるので、実装を使用して同じ機能を実行できるコードを提供してください。 –

+0

@ahmed osama - コードサンプルで編集された投稿。 –

+0

よくできて、ありがとう! –

関連する問題