2016-04-29 23 views
-2

In meiner Anwendung möchte ich, dass standardmäßig die Musik läuft. Aber wenn der Schalter in der about.java ausgeschaltet ist, sollte es ausgeschaltet sein. Also habe ich eine globale Variable erstellt. Aber das Problem ist, wenn ich den Schalter auf AUS klicke, gibt es einen Fehler.Android globale Variable Fehler

MainActivity.java

package com.example.asifsabir.breathholdingchallenge; 

import android.content.Intent; 
import android.graphics.Color; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.os.CountDownTimer; 

import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.concurrent.TimeUnit; 

public class MainActivity extends AppCompatActivity { 
    TextView tv1; 
    private android.support.v7.widget.Toolbar toolbar; 
    EditText et1, et2; 
    Button bt1, bt2; 
    public int min = 0; 
    public int sec = 0; 
    public int second = 0; 
    public CountDownTimer myC; 
    public MediaPlayer mySong; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.app_bar); 
     setSupportActionBar(toolbar); 
     toolbar.setTitle("Hold Breath Challenge"); 
     toolbar.setSubtitleTextColor(R.color.colortitle); 
     toolbar.setPopupTheme(R.style.AppTheme); 
     toolbar.inflateMenu(R.menu.main_menu); 
     toolbar.setTitleTextColor(Color.WHITE); 
     tv1 = (TextView) findViewById(R.id.textView1); 
     et1 = (EditText) findViewById(R.id.et1); 
     et2 = (EditText) findViewById(R.id.et2); 
     bt1 = (Button) findViewById(R.id.bt1); 
     bt2 = (Button) findViewById(R.id.bt2); 
     mySong = MediaPlayer.create(getApplicationContext(), R.raw.heartbeat); 
     mySong.setLooping(true); 
     MyApplication mAxx = (MyApplication) getApplicationContext(); 
     if (mAxx.getGlobalVarValue()) 
      mySong.start(); 
     else 
      mySong.pause(); 

     Toast.makeText(MainActivity.this, "You must click RESET before stating a new countdown!", Toast.LENGTH_LONG).show(); 
     bt1.setOnClickListener(
       new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 


         if ((!et1.getText().toString().isEmpty() && !et2.getText().toString().isEmpty()) || 
           !et1.getText().toString().isEmpty() || 
           !et2.getText().toString().isEmpty()) { 
          if (!et1.getText().toString().isEmpty()) 
           min = Integer.parseInt(et1.getText().toString()); 
          if (et1.getText().toString().isEmpty()) 
           min = 0; 

          if (!et2.getText().toString().isEmpty()) 
           second = Integer.parseInt(et2.getText().toString()); 
          if (et2.getText().toString().isEmpty()) 
           second = 0; 

          sec = min * 60 * 1000 + second * 1000; 
          myC = new CountDownTimer(sec, 1000) { 


           public void onTick(long millisUntilFinished) { 
            tv1.setText("" + String.format("%02d:%02d", 
              TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished), 
              TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(
                TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)))); 
           } 


           public void onFinish() { 
            tv1.setText("done!"); 
           } 
          }.start(); 
         } 
        } 
       } 
     ); 
     bt2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       myC.cancel(); 
       tv1.setText("Count"); 
      } 
     }); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main_menu, menu); 
     return true; 

    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 

     switch (item.getItemId()) { 
      //noinspection SimplifiableIfStatement 
      case R.id.about: 
       startActivity(new Intent(getApplicationContext(), About.class)); 

       return true; 


     } 

     return super.onOptionsItemSelected(item); 
    } 

} 

MyApplcation.java

package com.example.asifsabir.breathholdingchallenge; 

import android.app.Application; 

/** 
* Created by Asif Sabir on 29-Apr-16. 
*/ 
public class MyApplication extends Application { 
    public static boolean mGlobalVarValue=true; 

    public boolean getGlobalVarValue() { 
     return mGlobalVarValue; 
    } 

    public void setGlobalVarValue(boolean str) { 
     mGlobalVarValue = str; 
    } 
} 

About.java

package com.example.asifsabir.breathholdingchallenge; 

import android.graphics.Color; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.support.v4.app.NavUtils; 
import android.support.v7.app.AppCompatActivity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.CompoundButton; 
import android.widget.Switch; 
import android.widget.Toast; 

/** 
* Created by Asif Sabir on 20-Apr-16. 
*/ 

public class About extends AppCompatActivity { 
    android.support.v7.widget.Toolbar t1; 
    public static MyApplication myA; 
    Switch sw1; 
    public MyApplication mApp = (MyApplication) getApplication(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.about); 
     sw1 = (Switch) findViewById(R.id.sw1); 
     t1 = (android.support.v7.widget.Toolbar) findViewById(R.id.about_bar); 
     t1.setTitleTextColor(Color.WHITE); 
     setSupportActionBar(t1); 
     getSupportActionBar().setTitle("About"); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 
     sw1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        mApp.setGlobalVarValue(true); 
       } else { 
        mApp.setGlobalVarValue(false); 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 

     switch (item.getItemId()) { 
      //noinspection SimplifiableIfStatement 
      case R.id.home: 
       NavUtils.navigateUpFromSameTask(this); 


       return true; 

     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Fehlermeldung ist:

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.asifsabir.breathholdingchallenge.MyApplication.setGlobalVarValue(boolean)' on a null object reference 
                           at com.example.asifsabir.breathholdingchallenge.About$1.onCheckedChanged(About.java:41) 
+0

das ist keine globale Variable. das ist nur ein Klassenattribut ... –

+0

also wie kann ich das Problem lösen? Wie kann ich einen Schalter in Einstellungen verwenden, die einen booleschen Wert enthalten und andere Aktivitäten entsprechend diesem booleschen Wert ändern? –

Antwort

0

Wenn Ihre Absicht (basierend auf Ihrem Kommentar) ist wirklich die folgenden Funktionen ausführen:

wie kann ich einen Schalter in den Einstellungen verwenden, die einen Booleschen Wert und die Änderung der anderen Aktivitäten nach diesem Booleschen Wert enthalten?

Dann wird eine mögliche Lösung ist:

  1. Verwenden SharedPreferences den Booleschen Wert zu speichern, die „global“ sein soll.
  2. Erstellen Sie eine Einstellungen Activity or Fragment, die verwendet werden kann, um auf die globale Variable zuzugreifen/zu ändern.
  3. Überall wo Sie Zugriff auf den Wert benötigen, registrieren Sie eine listener für die Änderung. Siehe das Beispiel in der Dokumentation here.