Mr.Smile充填孔チ - アンドリュースP、10のGoogleのAndroidのネイティブの設定を調整ボリュームバー3のバグ

問題に見てみましょう

  1. 着信音量とアラーム音量が現象をリンクされます後にまず、通話の音量を調整します
  2. 音量バーでいずれかの音量を調整し、スプリングバック
  3. オープンハイ・ボリューム、ページを上下にすばやくスライド、ボリュームバーを調整し、再度通常の位置(音量を調整することを提供し、迅速スライドページへ)に、最後の位置にジャンプします

プログラムで見てみましょう

     最初の質問は最終的に、言う開始するための2つ目の質問で始まります。いくつかの問題が、定期的な問題を繰り返すことで、あなたには、いくつかの法律、私は安全に問題を見つけたりバイパス特定のバグに推測することができ、そこから法則を見つけることができます。

     質問2:

     私たちの大胆なフィギュア、その後、このボリュームのリバウンドは、テストを繰り返して、すべてのリバウンド位置が前の調整の位置であることがわかった、とボリュームサイズは、データベースの値が設定されていないことを示してバウンス位置、サイズで出て、なぜ最後の値になり、投機の下で論理検証の場所を見に行く、時間の割り当て問題がある可能性があります。アルプス/フレームワーク/ベース/コア/ジャワ/アンドロイド/嗜好/ SeekBarVolumizer.javaの このオープンルックでコード。

     postSetVolume(int型の進捗状況が)問題は本当にこの進行中であることがわかったデバッグ、セットはmLastAudibleStreamVolumeはこの事であるが、実際には、この事は非常にタイムリーな変更はないということです、ロジックは、このメソッドは、データベースを更新するために呼び出された後、音量スライダをドラッグすることです。したがって、問題の紙幣に対する解決策は、時間をonProgressChangedされ、メンバ変数のレコードの現在の場所に従事し、データベースを変更するために指の時に残すonStopTrackingTouch。

    質問3:

    二つの問題アイデアこれによれば、我々は最初の問題3つの現象を分析し、ボリュームに初めて家をセットアップするための時間から、この問題は発生しません入力した後、その後、ここで注意すべきページをスワイプしたら、ボリュームを調整する必要があります次回、シニアの下の部分の音量が問題を再現するために折り畳まキャンセル、およびいくつかのテストは、スライダーの位置が前の調整の場所も、点滅することを発見し、ここでは3つの情報を持っています:

  • そのような現象のページの初期化を入力します。
  • 位置合わせの後には、このような現象は、位置が点滅していないときの記事はでてこないエアコン
  • 音量バーは時間の視野には、このような現象が行われていません

    さて、問題の情報から導出は間違いリロードにボリュームバーのための時間でのプログレスバーの進捗状況や問題領域に問題がある、我々は、コードに問題が表示されますアルプス/ベンダー/メディアテック/独自仕様/パッケージ/apps/MtkSettings/src/com/android/settings/widget/SeekBarPreference.java確かに十分では、高速ボリュームを摺動するときの再離れ方法onBindViewHolder(PreferenceViewHolderビュー)に登場しました

 @Override
    public void onBindViewHolder(PreferenceViewHolder view) {
        super.onBindViewHolder(view);
        view.itemView.setOnKeyListener(this);
        mSeekBar = (SeekBar) view.findViewById(
                com.android.internal.R.id.seekbar);
        mSeekBar.setOnSeekBarChangeListener(this);
        mSeekBar.setMax(mMax);
        mSeekBar.setMin(mMin);
        // 添加
        Log.d("HZH", "onBindViewHolder: " + mCount);
        boolean useSeekProgress = mCount > 0 && this instanceof VolumeSeekBarPreference;
        mSeekBar.setProgress(useSeekProgress ? mSeekBar.getProgress() : mProgress);
        mCount++;
        // 添加结束
        final CharSequence title = getTitle();
        mSeekBar.setEnabled(isEnabled());
        .......
}

mSeekBar.setProgress時間は、mProgressの進行状況は前の記事の結果であり、二回onBindViewHolderに行くときに、新しいボリュームバーを参照してくださいので、ここでの問題は、使用MCOUNT> 0がそれを決定する理由として、それがあると結論づけています我々は、彼らがそのようなテキストにシークバースピーチのアクセスなどシークバー他の場所を、設定の影響を避けるためにVolumeSeekBarPreferenceのinstanceof、加えて、変更することができます前に、第2の時間に行きたい道もない裁判官に、このために使用されますそれは、ボリュームバーはリセットできないためにつながります。解決するには質問3以上です。

      一つの問題:

      最後の質問を見て、このバグは、本当に、コードはGoogleの兄も、バグがたくさんある、と非常に深く隠された、本当に形而上学本当に奇妙です。表面には本当にありません手掛かり、唯一「FML、この特別な何か?何を」私は目覚まし時計のシークバーには触れていなかった私の心に浮上したが、後でそれについて考える、または方向のポイントを持って、リングを調整するための時間ああ、手がそれに触れていることを区別することはできませんか?

      コードのみを参照するには手掛かり、とSeekBarVolumizer.javaとの問題点が同じものである、それは、その後、本当に、次のコメントに基づいて、法律を変更しようとしました、あなたは見分けることができたときにonProgressChanged、場所を区別できることが判明しました取得。

public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callback {
    private static final String TAG = "SeekBarVolumizer";

    ...................................

    private boolean mFromTouch;
    private int mProgress;

    ......................

    protected void updateSeekBar() {
        final boolean zenMuted = isZenMuted();
        mSeekBar.setEnabled(!zenMuted);
        // Modify 
        if((mLastProgress == -1) || (mLastAudibleStreamVolume == mLastProgress)){
        //Modify end
            if (zenMuted) {
                mSeekBar.setProgress(mLastAudibleStreamVolume, true);
            } else if (mNotificationOrRing && mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
                mSeekBar.setProgress(0, true);
            } else if (mMuted) {
                mSeekBar.setProgress(0, true);
            } else {
                mSeekBar.setProgress(mLastProgress > -1 ? mLastProgress : mOriginalStreamVolume, true);
            }
        }
    }

    @Override
    public boolean handleMessage(Message msg) {
        switch (msg.what) {
            case MSG_SET_STREAM_VOLUME:
                // 删除
                //if (mMuted && mLastProgress > 0) {
                //    mAudioManager.adjustStreamVolume(mStreamType, AudioManager.ADJUST_UNMUTE, 0);
                //} else if (!mMuted && mLastProgress == 0) {
                //    mAudioManager.adjustStreamVolume(mStreamType, AudioManager.ADJUST_MUTE, 0);
                //}
                // 删除结束
                mAudioManager.setStreamVolume(mStreamType, mLastProgress,
                        AudioManager.FLAG_SHOW_UI_WARNINGS);
                break;
           .......
    }

   

    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
        // 添加
        mProgress = progress;
        mFromTouch = fromTouch;
        //添加
    }

    //添加
    private void startChangeProgress(SeekBar seekBar){
        Log.d(TAG,"mProgress: "+mProgress);
        if (mFromTouch) {
            postSetVolume(mProgress);
        }
        if (mCallback != null) {
            mCallback.onProgressChanged(seekBar, mProgress, mFromTouch);
        }
    }
    //添加

   ............

    public void onStopTrackingTouch(SeekBar seekBar) {
        // 添加
        startChangeProgress(seekBar);
        // 添加结束
        postStartSample();
    }

    ...........
}

これは、三つの問題が解決され、私はこの記事のコードは、5枚のコインを実際にCで見つかった私の場所で完全に自由の問題や、より良いがある場合は、しかし、あなたが助けに機会を持っている場合は、賞賛を残すことを望んで解決策は、私に知らせてください。

公開された22元の記事 ウォン称賛29 ビュー60000 +

おすすめ

転載: blog.csdn.net/Keep_Holding_On/article/details/104038099