2017-01-09 3 views
2

Ich bin neu in Android und ich muss einen AlertDialog erstellen, wenn ich eine bestimmte Taste drücke. AlertDialog hat eine Suchleiste und die seekBar wird verwendet, um die Lautstärke für meine Anwendung zu ändern. Aber ich kann es nicht funktionieren lassen. Kannst du mir bitte helfen? Vielen Dank.Popup AlertDialog mit einer seekBar zum Ändern der App-Lautstärke

ich diesen Fehler:

java.lang.NullPointerException: Der Versuch, virtuelle Methode 'Leere android.widget.SeekBar.setMax (int)' auf ein Null-Objekt Referenz

und mein Code sieht aufzurufen wie folgt aus:

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(); 
    } 
} 

und das ist mein volum_dialog.xml Datei:

<?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> 

Antwort

1

Sie versuchen, Ihre seekbar in Ihrem contextView (R.layout.activity_setting) zu finden:

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

Es gibt null zurück, weil Sie erstellt SeekBar- dynamisch für Ihren Alertdialog:

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

Um dieses Problem zu lösen ändern Sie diese Zeile (SeekBar)findViewById(R.id.volumeSeekBar); zu:

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

Es wird versucht SeekBar- in View v statt ContextView zu finden, welche fi funktionieren sollte ne.

Verwandte Themen