开发者

Need help with android.os.Build.VERSION.SDK_INT and SharedPreferences

I have a main activity where I call

VersionSettings vs = new VersionSettings(this);
    if (vs.firstRun2()) 
        vs.versionCheckbox();

What I'm trying to do is set a checkbox (checkboxVideoType) to an unchecked state if the Android version is 1.6-2.1

I only want to do this the very first time the app is ever run, it never needs to run again.

I think I'm running into the problem when the main activity calls versionCheckbox(), I get a force close if it attempts to run the code inside that is going to set the checkbox to false.

I'm very new to programming and would really appreciate some help with this. I think I'm close, but need a push. Thanks in advance!

Main Activity

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;



public class Nasatv extends Activity implements OnClickListener  {

boolean checkboxIsChecked;
SharedPreferences nasaTV_Prefs;




@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.main);

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title);

    nasaTV_Prefs = getSharedPreferences("nasaTV_Prefs", 0);

    ChangeLog cl = new ChangeLog(this);
    if (cl.firstRun())
        cl.getLogDialog().show();

    VersionSettings vs = new VersionSettings(this);
    if (vs.firstRun2()) 
        vs.versionCheckbox();


    Button button = (Button) findViewById(R.id.button1);
    button.setOnClickListener(this); 


    Button button2 = (Button) findViewById(R.id.button2);
    button2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent i = new Intent(Nasatv.this, LaunchCalendar.class);
            startActivity(i);          

        }
    });


    Button button3 = (Button) findViewById(R.id.button3);
    button3.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent i = new Intent(Nasatv.this, PhotoInfo.class);
            startActivity(i);   
        }
    }); 


    CheckConnectivity check = new CheckConnectivity();
    Boolean conn = check.checkNow(this.getApplicationContext());
    if(conn == true){
        ImageView updateImage = (ImageView) findViewById(R.id.updateImage);
        ImageDownloader downloader = new ImageDownloader(updateImage);
        downloader.execute("http://www.url.com/trl/ubox.jpg");
    } else {
        ImageView updateImage = (ImageView) findViewById(R.id.updateImage);
        updateImage.setImageResource(R.drawable.uboxerror);
    } 
}




public boolean onCreateOptionsMenu(Menu menu) 
{
    super.onCreateOptionsMenu(menu);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
    return true;
}


public boolean onOptionsItemSelected(MenuItem item) 
{
    switch (item.getItemId()) 
    {
        case R.id.setting_title:
            Intent settingsActivity =new Intent(getBaseContext(), Settings.class);
            startActivity(settingsActivity);
            return true;

        case R.id.photo_archive:
            Intent archive = new Intent(Nasatv.this, PhotoArchive.class);
            startActivity(archive);
            return true;

        case R.id.n_web:
            Intent intent = new Intent(Intent.ACTION_VIEW,     Uri.parse("http://www.nasa.gov/"));
            startActivity(intent);
            return true;

        case R.id.exit_title:
            finish();
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}



public void onResume() {
    super.onResume();
    checkboxIsChecked = nasaTV_Prefs.getBoolean("checkboxVideoType", true);
}



@Override
public void onClick(View v) {
    if (checkboxIsChecked) {
        Intent intent = new Intent(Intent.ACTION_VIEW,     Uri.parse("http://www.nasa.gov/multimedia/nasatv/nasatv_android_flash.html"));
         startActivity(intent);
    } else {
        Intent intent = new Intent(Intent.ACTION_VIEW,     Uri.parse("rtsp://nasadln.qt.llnwd.net/nasa101.sdp"));
        startActivity(intent);
    }

}


}

One-time run class

 import android.content.Context;
 import android.content.SharedPreferences;
 import android.preference.PreferenceManager;
 import android.util.Log;
 import android.widget.CheckBox;



      public class VersionSettings {

    private final Context context;
    private String notRun, hasRun;
    private SharedPreferences run;
    private CheckBox checkboxVideoType;
    private SharedPreferences nasaTV_Prefs;
    private static final String HAS_RUN = "PREFS_HAS_RUN";


int currentapiVersion = android.os.Build.VERSION.SDK_INT;

/**
 * Constructor
 *
 * Retrieves whether the app has been run or not and saves to
 * SharedPreferences
 */
    public VersionSettings(Context context) {
    this.context = context;

    this.run = PreferenceManager.getDefaultSharedPreferences(context);

    // get run/not run string number, which is "1"
    this.notRun = run.getString(HAS_RUN, "");
    Log.d(TAG, "notRun: " + notRun);
    this.hasRun = context.getResources().getString(R.string.has_run_string);
    Log.d(TAG, "hasRun: " + hasRun);

    // save new number to preferences, which will be the same number, 
    // so this is run only the very first time the app is run
    SharedPreferences.Editor editor = run.edit();
    editor.putString(HAS_RUN, hasRun);
    editor.commit();
}


/**
 * @return  true if this version of your app is started for the first
 *          time
 */
public boolean firstRun2() {
    return  ! notRun.equals(hasRun);
} 


/**
 * @return  Change the checkboxVideoType to "unchecked" (false)
 *          
 */
public void versionCheckbox() {
//  this.context = context;

        if (currentapiVersion < android.os.Build.VERSION_CODES.FROYO){

            this.nasaTV_Prefs = PreferenceManager.getDefaultSharedPreferences(context);
            SharedPreferences.Editor editor = nasaTV_Prefs.edit();
            editor.putBoolean("checkboxVideoType", false);
            editor.commit();
        }
}

private static final String TAG = "VersionSettings";
}

Preferences Activity

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
impo开发者_运维技巧rt android.widget.CompoundButton.OnCheckedChangeListener;

public class Settings extends Activity implements OnCheckedChangeListener {

private CheckBox checkboxVideoType;
private SharedPreferences nasaTV_Prefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

            setContentView(R.layout.preferences);

            getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title);

            checkboxVideoType  =  (CheckBox) findViewById(R.id.checkboxVideoType);
            checkboxVideoType.setOnCheckedChangeListener(this);
            nasaTV_Prefs = getSharedPreferences("nasaTV_Prefs", 0);
            checkboxVideoType.setChecked(nasaTV_Prefs.getBoolean("checkboxVideoType", true));



            Button clbutton = (Button) findViewById(R.id.clbutton);
            clbutton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                ChangeLog cl = new ChangeLog(Settings.this);
                cl.getFullLogDialog().show();

        }
    });

    }

    public void onCheckedChanged(CompoundButton cb, boolean isChecked) {

          if (cb == checkboxVideoType){                     
            SharedPreferences.Editor editor = nasaTV_Prefs.edit();  
            editor.putBoolean("checkboxVideoType", isChecked);
            editor.commit();        // Commit the edit, i.e.,     save the state of the flag!
          }
    }

}


I just noticed your checkboxVideoType is a private property of this class, and I don't see a setter anywhere. If it's null, you'll get a NullPointerException which will cause a FC. You will need to pass a reference to the checkbox object (perhaps as a parameter to the versionCheckbox() method).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜