1

My layouts are inflated in the PagerAdapter. Both of them have number of edit text fields. The value from the edit text fields is passed in an object which is then used in a fragment. However when the device is rotated all of the values are lost, which is normal. How can I save and retrieve the values that I have set in the adapter?

public class AuthPeemAdapter extends PagerAdapter {

Context mContext;
int[] mResources;
String[] mTitles;
PreferenceAdapter mPreferenceAdapter;
public AuthPeemAdapter.OnAuthPeemInteractionListener mListener;

public interface OnAuthPeemInteractionListener {
    void onAuth(String action);

    void onRegisterActivationCode(UserInfo userInfo);

    void onLogin(UserInfo userInfo);
}

public AuthPeemAdapter(Context context) {
    this.mContext = context;
    this.mResources = new int[2];
    this.mResources[0] = R.layout.shop_login;
    this.mResources[1] = R.layout.shop_register;
    this.mTitles = new String[2];
    this.mTitles[0] = "Login";
    this.mTitles[1] = "Register";
    this.mPreferenceAdapter = new PreferenceAdapter(context);
}

@Override
public Object instantiateItem(ViewGroup collection, final int position) {
    LayoutInflater inflater = LayoutInflater.from(mContext);
    ViewGroup layout;
    View view;
    final EditText username;
    final EditText password;
    final EditText confirmPassword;
    final EditText firstName;
    final EditText lastName;
    final EditText companyName;
    final EditText peemName;
    final EditText peemPassword;
    Button button;
    if (position == 0) {//Login
        layout = (ViewGroup) inflater.inflate(mResources[position], collection, false);

        view = layout.findViewById(R.id.tv_register_now);
        username = (EditText) layout.findViewById(R.id.et_email);
        password = (EditText) layout.findViewById(R.id.et_password);
        password.setVisibility(View.GONE);
        peemName = (EditText) layout.findViewById(R.id.et_peem_name);
        peemPassword = (EditText) layout.findViewById(R.id.et_peem_pass);
        button = (Button) layout.findViewById(R.id.btn_login);

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onAuth(mTitles[position]);
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UserInfo userInfo = new UserInfo();
                if (username.getText().toString().isEmpty() || !Patterns.EMAIL_ADDRESS.matcher(username.getText().toString()).matches()) {
                    username.setError("Please enter valid email address");
                    return;
                } else {
                    userInfo.setEmail(username.getText().toString());
                }
                if (peemName.getText().toString().isEmpty()) {
                    peemName.setError("Cannot be left blank");
                    return;
                } else {
                    userInfo.setPeemName(peemName.getText().toString());
                }
                if (peemPassword.getText().toString().isEmpty()) {
                    peemPassword.setError("Must be at least 6 characters");
                    return;
                } else {
                    userInfo.setPeemPass(peemPassword.getText().toString());
                }
                mPreferenceAdapter.serializeUserInfo(userInfo);
                mPreferenceAdapter.apply();
                mListener.onLogin(userInfo);
            }
        });
        collection.addView(layout);
    } else {//Register
        layout = (ViewGroup) inflater.inflate(mResources[position], collection, false);
        view = layout.findViewById(R.id.tv_register_now);
        username = (EditText) layout.findViewById(R.id.et_email);
        password = (EditText) layout.findViewById(R.id.et_password);
        confirmPassword = (EditText) layout.findViewById(R.id.et_confirm_password);
        confirmPassword.setVisibility(View.GONE);
        firstName = (EditText) layout.findViewById(R.id.et_first_name);
        lastName = (EditText) layout.findViewById(R.id.et_last_name);
        companyName = (EditText) layout.findViewById(R.id.et_company_name);
        button = (Button) layout.findViewById(R.id.btn_register);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onAuth(mTitles[position]);
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UserInfo userInfo = new UserInfo();
                if (username.getText().toString().isEmpty() || !Patterns.EMAIL_ADDRESS.matcher(username.getText().toString()).matches()) {
                    username.setError("Please enter valid email address");
                    return;
                } else {
                    userInfo.setEmail(username.getText().toString());
                }
                if (password.getText().toString().isEmpty()) {
                    password.setError("Must be at least 6 characters");
                    return;
                } else {
                    userInfo.setPassword(password.getText().toString());
                }
                if (companyName.getText().toString().isEmpty()) {
                    companyName.setError("Cannot be left blank");
                    return;
                } else {
                    userInfo.setCompany(companyName.getText().toString());
                }
                if (firstName.getText().toString().isEmpty()) {
                    firstName.setError("Cannot be left blank");
                    return;
                } else {
                    userInfo.setFirstName(firstName.getText().toString());
                }
                if (lastName.getText().toString().isEmpty()) {
                    lastName.setError("Cannot be left blank");
                    return;
                } else {
                    userInfo.setLastName(lastName.getText().toString());
                }
                mListener.onRegisterActivationCode(userInfo);
            }
        });
        collection.addView(layout);
    }
    return layout;
}

@Override
public void destroyItem(ViewGroup collection, int position, Object view) {
    collection.removeView((View) view);
}

@Override
public int getCount() {
    return 2;
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == object;
}

@Override
public CharSequence getPageTitle(int position) {
    return mTitles[position];
}

public void addOnAuthPeemInteractionListener(AuthPeemAdapter.OnAuthPeemInteractionListener listener) {
    mListener = listener;
}

public void removeOnAuthPeemInteractionListener() {
    this.mListener = null;
}

}

Esteban
  • 667
  • 9
  • 22
  • [Have a look at this answer](http://stackoverflow.com/a/10126961/6910818) – Mohammad Ahsan Jan 10 '17 at 10:43
  • I know how to save the value, but the problem here is that my EditText and it's layout are within the adapter. I have no access to them in the fragment. – Esteban Jan 10 '17 at 11:04

1 Answers1

1

try this:

implement the onSaveInstanceState method in your Fragment.

    public void onSaveInstanceState(Bundle savedState) {

    super.onSaveInstanceState(savedState);

    // getValues() is a method in your Adapter return your editext values..
    String[] values = mAdapter.getValues(); 
    savedState.putStringArray("myKey", values);

}

Now when the device rotate fragment gets recreated so You can then retrieve the data in your fragment onCreate method

    public void onCreate (Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        String[] values = savedInstanceState.getStringArray("myKey");
        if (values != null) {
           mAdapter = new MyAdapter(values); //pass values to your adapter class..
        }
    }

}
rafsanahmad007
  • 23,683
  • 6
  • 47
  • 62
  • I've done this in my adapter `public String saveValues() { return userNamee.getText().toString(); } public void restoreValues(String value) { userNamee.setText(value); }`. The only problem I get is that after rotation the edittext, in this case userNamee, is null. – Esteban Jan 10 '17 at 13:05
  • You have to inflate your view again in adapter ..as during rotation the views get destroyed... – rafsanahmad007 Jan 10 '17 at 13:27