2017-01-10 1 views
1

Meine Layouts sind im PagerAdapter aufgebläht. Beide haben eine Anzahl von Textfeldern. Der Wert aus den Bearbeitungstextfeldern wird in einem Objekt übergeben, das dann in einem Fragment verwendet wird. Wenn das Gerät jedoch gedreht wird, gehen alle Werte verloren, was normal ist. Wie kann ich die Werte, die ich im Adapter eingestellt habe, speichern und abrufen?Edittext-Wert von PagerAdapter bei Rotationswechsel speichern

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

}

+0

[Haben Sie einen Blick auf diese Antwort] abrufen (http://stackoverflow.com/ a/10126961/6910818) –

+0

Ich weiß, wie man den Wert speichert, aber das Problem ist, dass mein EditText und sein Layout innerhalb des Adapters sind. Ich habe keinen Zugang zu ihnen im Fragment. – Esteban

Antwort

1

try this:

die onSaveInstanceState Methode in Ihrem Fragment implementieren.

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

} 

Nun, wenn das Gerät drehen fragment neu erstellt wird, so können Sie dann die Daten in Ihrem Fragment onCreate Methode

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.. 
     } 
    } 

} 
+0

Ich habe dies in meinem Adapter getan 'public String saveValues ​​() { Rückgabe userName.getText(). ToString(); } public void restoreValues ​​(Zeichenfolgenwert) { userNamee.setText (Wert); } '. Das einzige Problem, das ich bekomme, ist, dass nach der Rotation der Edittext, in diesem Fall userNamee, null ist. – Esteban

+0

Sie müssen Ihre Ansicht im Adapter wieder aufblasen. Während der Rotation werden die Ansichten zerstört ... – rafsanahmad007

0

können Sie AddTextChangeListener Methode verwenden.

EditText searchTo = (EditText)findViewById(R.id.medittext); 
searchTo.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void afterTextChanged(Editable s) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     doSomething(); 
    } 
}); 

Speichern Sie Wert von Text bearbeiten in afterTextChange-Methode, damit Sie auch nach der Drehung Wert erhalten können.

Hoffe, diese Antwort hilft.

Glücklich Codierung ....

Verwandte Themen