Popup AlertDialog с seekBar для изменения громкости приложения

Я новичок в Android, и мне нужно создать AlertDialog, когда я нажимаю определенную кнопку. AlertDialog имеет панель поиска, и панель поиска используется для изменения громкости моего приложения. Но я не могу заставить его работать. Не могли бы вы мне помочь? Спасибо.

Я получаю эту ошибку:

java.lang.NullPointerException: попытка вызвать виртуальный метод «void android.widget.SeekBar.setMax(int)» для нулевой ссылки на объект

и мой код выглядит так:

public class Setting extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_setting);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    public AlertDialog AlarmVolume(View view) {

        /*
    This part of code creates a dialog which has a seekbar for volume.
     */
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inflater.inflate(R.layout.volume_dialog, (ViewGroup) findViewById(R.id.settingsItem));
    builder.setView(v).setTitle("Adjust Alarm Volume").setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //TODO save new volume amount
        }
    }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
        }
    });

    SeekBar seekbarVolume = (SeekBar)findViewById(R.id.volumeSeekBar);
    final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
    seekbarVolume.setMax(audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM));
    seekbarVolume.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_ALARM));

    seekbarVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {     

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

и это мой файл volum_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<SeekBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/volumeSeekBar"
    android:layout_marginTop="15sp"
    android:layout_weight="1" />
</LinearLayout>

person Maedeh HM    schedule 09.01.2017    source источник


Ответы (1)


Вы пытаетесь найти свою панель поиска в своем contextView (R.layout.activity_setting):

 SeekBar seekbarVolume = (SeekBar)findViewById(R.id.volumeSeekBar);

Он возвращает null, потому что вы создали SeekBar динамически для своего AlertDialog:

View v = inflater.inflate(R.layout.volume_dialog, (ViewGroup) findViewById(R.id.settingsItem));

Чтобы решить эту проблему, измените эту строку (SeekBar)findViewById(R.id.volumeSeekBar); на:

(SeekBar) v.findViewById(R.id.volumeSeekBar);

Он пытается найти вашу панель поиска в View v вместо ContextView, что должно работать нормально.

person Arashsoft    schedule 09.01.2017