I would like to resume activity which i have stored in share preferences in viewpager. I have stored the activity details in onSaveState and retrieve the activity getpreferences in onResume. But somehow, it returns error that the key is in null value in onSaveState. How to save the preferences in viewpager ?
Here is the code
public class FullScreenImageActivity extends AppCompatActivity {
ViewPager viewPager;
ImageView favBtn;
private SharedPreference sharedPreference;
Activity context = this;
private Fragment contentFragment;
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
public void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fullscreen_image); //TBS
FragmentManager fragmentManager = getSupportFragmentManager();
if (Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
if (savedInstanceState.containsKey("content")) {
String content = savedInstanceState.getString("content");
if (content.equals(FavouriteListFragment.ARG_ITEM_ID)) {
if (fragmentManager.findFragmentByTag(FavouriteListFragment.ARG_ITEM_ID) != null) {
contentFragment = fragmentManager
.findFragmentByTag(FavouriteListFragment.ARG_ITEM_ID);
}
}
}
Intent i = getIntent();
int position = i.getIntExtra("position", 0);
String[] arr=i.getStringArrayExtra("array");
String url = i.getStringExtra("url");
sharedPreference = new SharedPreference();
viewPager = (ViewPager) findViewById(R.id.slider);
viewPager.setAdapter(new GalleryViewPagerAdapter(this, arr, position, url));
viewPager.setCurrentItem(position);
}
class GalleryViewPagerAdapter extends PagerAdapter {
private Context context;
LayoutInflater inflater;
private String[] imageArrayList;
private String mUrl;
private int mPosition;
private ProgressDialog mProgress;
public GalleryViewPagerAdapter(Context _context, String[] imageArrayList, int position, String url) {
context = _context;
this.imageArrayList = imageArrayList; //null;
this.mPosition=position;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mUrl=url;
}
@Override
public int getCount() {
return imageArrayList.length;
}
@Override
public Object instantiateItem(final ViewGroup container, final int position) {
showProgress();
favBtn = (ImageView) findViewById(R.id.btn_favourite);
String favoriteUrl=sharedPreference.getPrefsFavUrl(context);
//Boolean stateBtnNow=sharedPreference.getBtnState(context,mUrl);//why mUrl change to same url with favourite
Boolean stateBtnNow=false;
if(stateBtnNow) {
favBtn.setColorFilter(Color.argb(255, 249, 0, 0));//red
}
else
{
favBtn.setColorFilter(Color.argb(255, 192, 192, 192));
}
favBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Boolean stateBtn = sharedPreference.getBtnState(context, mUrl);
Boolean stateBtn=false;
if (!stateBtn) {
sharedPreference.save(context, mUrl);
//edit to save url in array
//sharepreference.add(context, product);
sharedPreference.saveBtnState(context, stateBtn);
Toast.makeText(context,
"Added to Favourite!",
Toast.LENGTH_SHORT).show();
favBtn.setColorFilter(Color.argb(255, 249, 0, 0));//red
Toast.makeText(context,
"Button state is " + stateBtn,
Toast.LENGTH_SHORT).show();
} else {
sharedPreference.saveBtnState(context, stateBtn);
favBtn.setColorFilter(Color.argb(255, 192, 192, 192));//grey
}
}
});
View photoRow = inflater.inflate(R.layout.item_fullscreen_image, container,
false);
TouchImageView fullScreenImg;
fullScreenImg =(TouchImageView)photoRow.findViewById(R.id.img_flickr);
// added imageloader for better performance
StaggeredDemoApplication.getImageLoader().get(imageArrayList[position],
ImageLoader.getImageListener(fullScreenImg, R.drawable.bg_no_image, android.R.drawable.ic_dialog_alert), container.getWidth(), 0);
((ViewPager) container).addView(photoRow);
stopProgress();
return photoRow;
}
private void stopProgress() {
mProgress.cancel();
}
private void showProgress() {
mProgress = ProgressDialog.show(FullScreenImageActivity.this, "", "Loading...");
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((RelativeLayout) object);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// Remove viewpager_item.xml from ViewPager
((ViewPager) container).removeView((RelativeLayout) object);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("content", FavouriteListFragment.ARG_ITEM_ID);
super.onSaveInstanceState(outState);
}
@Override
public void onResume() {
super.onResume();
}
}
Here is the code in sharepreferences
public class SharedPreference {
public static final String PREFS_NAME = "AOP_PREFS";
public static final String PREFS_STATE="AOP_BTN";
public static final String PREFS_FAV_URL="AOP_FAV_URL";
public static final String PREFS_KEY = "AOP_PREFS_String";
public static final String PREF_BTN_KEY = "AOP_PREF_BTN";
public static final String PREF_URL_KEY = "AOP_PREF_URL";
public SharedPreference() {
super();
}
public void save(Context context, String text) {
SharedPreferences settings;
Editor editor;
//edit here to add image array list
//settings = PreferenceManager.getDefaultSharedPreferences(context);
settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); //1
editor = settings.edit(); //2
editor.putString(PREFS_KEY, text); //3
editor.commit(); //4
}
public String getValue(Context context) {
SharedPreferences settings;
String text;
//settings = PreferenceManager.getDefaultSharedPreferences(context);
settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
text = settings.getString(PREFS_KEY, null);
return text;
}
public String getPrefsFavUrl(Context context){
SharedPreferences settings;
String favUrl;
settings = context.getSharedPreferences(PREFS_FAV_URL, Context.MODE_PRIVATE);
favUrl = settings.getString(PREF_URL_KEY, null);
return favUrl;
}
public void clearSharedPreference(Context context) {
SharedPreferences settings;
Editor editor;
//settings = PreferenceManager.getDefaultSharedPreferences(context);
settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
editor = settings.edit();
editor.clear();
editor.commit();
}
public void removeValue(Context context) {
SharedPreferences settings;
Editor editor;
settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
editor = settings.edit();
editor.remove(PREFS_KEY);
editor.commit();
}
public void saveBtnState(Context context, Boolean stateBtn) {
SharedPreferences settings;
Editor editor;
//settings = PreferenceManager.getDefaultSharedPreferences(context);
settings = context.getSharedPreferences(PREFS_STATE, Context.MODE_PRIVATE); //1
editor = settings.edit(); //2
editor.putBoolean(PREF_BTN_KEY, stateBtn);//added state for button
editor.commit(); //4
}
public boolean getBtnState(Context context,String text)//edit to store url here and check the boolean here
{
SharedPreferences prefs;
prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
String favUrl = getPrefsFavUrl(context);
boolean switchState = false;
if(favUrl.equals(text)) {
switchState=true;
}
return switchState;
}
public void saveFavourite(FragmentActivity activity, String favouriteUrl) {
SharedPreferences settings;
Editor editor;
settings = activity.getSharedPreferences(PREFS_FAV_URL, Context.MODE_PRIVATE); //1
editor = settings.edit(); //2
editor.putString(PREF_URL_KEY, favouriteUrl); //3
editor.commit(); //4
}
}
Here is the error log file
02-03 09:48:57.928 15368-15368/com.example.myapp W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.Class.newInstance()' on a null object reference
02-03 09:48:57.928 15368-15368/com.example.myapp W/System.err: at com.example.myapp.MainActivity.displayView(MainActivity.java:141)
02-03 09:48:57.928 15368-15368/com.example.myapp W/System.err: at com.example.myapp.MainActivity.onCreate(MainActivity.java:41)
02-03 09:48:57.928 15368-15368/com.example.myapp W/System.err: at android.app.Activity.performCreate(Activity.java:5990)
Here is my MainActivity program
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, FragmentFlickrGridImage.OnFragmentInteractionListener, ShareActionProvider.OnShareTargetSelectedListener {
private int backstack_count;
private boolean viewIsAtHome;
private Fragment contentFragment;
private ShareActionProvider share;
private Intent shareIntent=new Intent(Intent.ACTION_SEND);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (savedInstanceState == null) {
displayView(R.id.recent_picture);
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setItemIconTintList(null);
navigationView.setNavigationItemSelectedListener(this);
shareIntent.setType("text/plain");
}
private void replaceFragment(Fragment fragment, boolean isAddToBackStack) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.flContent, fragment);
if (isAddToBackStack) {
transaction.addToBackStack(fragment.getClass().toString());
backstack_count ++;
}
transaction.commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
MenuItem item = menu.findItem(R.id.share);
share = new ShareActionProvider(this);
MenuItemCompat.setActionProvider(item, share);
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.
int id = item.getItemId();
if (id == R.id.share) {
onShareAction();
return true;
}
return super.onOptionsItemSelected(item);
}
private void onShareAction() {
String yourShareText = "test";
Intent shareIntent = ShareCompat.IntentBuilder.from(this).setType("text/plain").setText(yourShareText).getIntent();
// Set the share Intent
if (share != null) {
share.setShareIntent(shareIntent);
}
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
displayView(item.getItemId());
return true;
}
private void displayView(int itemId) {
Fragment fragment = null;
Class fragmentClass = null;
String title="";
switch (itemId){
case R.id.one:
fragment = new FragmentFlickrGridImage("one");
title="one";
viewIsAtHome=true;
break;
case R.id.two:
fragment = new FragmentFlickrGridImage(" two");
title ="two";
viewIsAtHome=false;
break;
case R.id.three:
fragment = new FragmentFlickrGridImage("three");
title="three";
viewIsAtHome=false;
break;
case R.id.four:
fragment=new FavouriteListFragment();
title="Favourite";
viewIsAtHome=false;
break;
}
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
getSupportActionBar().setTitle(title);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
}
@Override
public void onFragmentInteraction(Uri uri) {
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
}
if (!viewIsAtHome) { //if the current view is not the Recent Hot Girl fragment
displayView(R.id.recent_picture);
} else {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
//Yes button clicked
finish();
break;
case DialogInterface.BUTTON_NEGATIVE:
//No button clicked
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setMessage("Are you sure?")
.setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener)
.setCancelable(false)
.setTitle("Exit");
builder.show();
}
}
@Override
public boolean onShareTargetSelected(ShareActionProvider source,
Intent intent) {
Toast.makeText(this, intent.getComponent().toString(),
Toast.LENGTH_LONG).show();
return(false);
}
}