【问题标题】:Android SeekBar setOnSeekBarChangeListenerAndroid SeekBar setOnSeekBarChangeListener
【发布时间】:2021-01-29 03:43:24
【问题描述】:

我想知道 android SeekBars OnSeekBarChangeListener 的行为。特别是,onProgressChanged 方法是否仅在搜索栏上的第一次和最后一次触摸时通知?

我正在尝试刷新应该显示 SeekBar 当前进度的 TextView。但是 TextView 只是在第一次触摸和最后一次触摸时更新。调试这证实了我的假设,即这个方法只被调用了两次 :( 我想要的是 TextView 显示 SeekBar 中的每一个进度变化。

简而言之:我正在寻找一种可能性来获得一个进度侦听器,该侦听器在每次小的进度更改时都会被调用。

【问题讨论】:

    标签: android seekbar


    【解决方案1】:

    希望对你有帮助:

    final TextView t1=new TextView(this); 
    t1.setText("Hello Android");        
    final SeekBar sk=(SeekBar) findViewById(R.id.seekBar1);     
    sk.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {       
    
        @Override       
        public void onStopTrackingTouch(SeekBar seekBar) {      
            // TODO Auto-generated method stub      
        }       
    
        @Override       
        public void onStartTrackingTouch(SeekBar seekBar) {     
            // TODO Auto-generated method stub      
        }       
    
        @Override       
        public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {     
            // TODO Auto-generated method stub      
    
            t1.setTextSize(progress);
            Toast.makeText(getApplicationContext(), String.valueOf(progress),Toast.LENGTH_LONG).show();
    
        }       
    });             
    

    【讨论】:

    • 另外...在同一时间范围内多次发布相当于相同 sn-p 的代码也被认为有点垃圾邮件。
    • 这可以通过 XML 完成吗?我找不到它的属性。
    【解决方案2】:

    onProgressChanged() 应该在每个进度更改时调用,而不仅仅是在第一次和最后一次触摸(这就是为什么你有 onStartTrackingTouch() 和 onStopTrackingTouch() 方法)。

    确保你的 SeekBar 有超过 1 个值,也就是说你的 MAX>=3。

    在您的 onCreate 中:

     yourSeekBar=(SeekBar) findViewById(R.id.yourSeekBar);
     yourSeekBar.setOnSeekBarChangeListener(new yourListener());
    

    你的听众:

    private class yourListener implements SeekBar.OnSeekBarChangeListener {
    
            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                                // Log the progress
                Log.d("DEBUG", "Progress is: "+progress);
                                //set textView's text
                yourTextView.setText(""+progress);
            }
    
            public void onStartTrackingTouch(SeekBar seekBar) {}
    
            public void onStopTrackingTouch(SeekBar seekBar) {}
    
        }
    

    请分享一些代码和日志结果以获得进一步的帮助。

    【讨论】:

      【解决方案3】:

      每次移动光标时都会调用onProgressChanged。

      @Override
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
          textView.setText(String.valueOf(new Integer(progress)));        
      }
      

      所以 textView 应该显示进度并在移动搜索栏时始终改变。

      【讨论】:

        【解决方案4】:

        所有答案都是正确的,但你需要先将一个长大的胖数转换为计时器:

            public String toTimer(long milliseconds){
            String finalTimerString = "";
            String secondsString;
            // Convert total duration into time
            int hours = (int)( milliseconds / (1000*60*60));
            int minutes = (int)(milliseconds % (1000*60*60)) / (1000*60);
            int seconds = (int) ((milliseconds % (1000*60*60)) % (1000*60) / 1000);
            // Add hours if there
            if(hours > 0){
                finalTimerString = hours + ":";
            }
            // Prepending 0 to seconds if it is one digit
            if(seconds < 10){
                secondsString = "0" + seconds;
            }else{
                secondsString = "" + seconds;}
            finalTimerString = finalTimerString + minutes + ":" + secondsString;
            // return timer string
            return finalTimerString;
        }
        

        这就是你使用它的方式:

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        textView.setText(String.format("%s", toTimer(progress)));        
        }
        

        【讨论】:

          【解决方案5】:

          覆盖所有方法

              @Override
              public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
          
          
              }
          
              @Override
              public void onStartTrackingTouch(SeekBar arg0) {
          
          
              }
          
              @Override
              public void onStopTrackingTouch(SeekBar arg0) {
          
          
              }
          

          【讨论】:

            【解决方案6】:

            Seekbar 在我们第一次初始化时调用了 onProgressChanged 方法。我们可以使用下面的代码跳过 自动初始化时需要检查布尔值是否返回false

            volumeManager.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                        @Override
                        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                            if(b){
                                mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0);
                            }
                        }
            
                        @Override
                        public void onStartTrackingTouch(SeekBar seekBar) {
            
                        }
            
                        @Override
                        public void onStopTrackingTouch(SeekBar seekBar) {
            
                        }
                    });
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-09-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-04-05
              相关资源
              最近更新 更多