问题
I have a gridview with editTexts as the individual views in it. I want to save the values that are in each of the editTexts because they are dissapearing when I switch to another fragment or press the home button, so how do I do that?
Would I need an array or arraylist that holds all of the views? How would I get the views if I did that?
fragment_score_red.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".RedScorerFragment"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/gridLabel__red"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:text="@string/grid_label__red"
android:background="@color/white"
android:paddingTop="5dp"
/>
<GridView
android:id="@+id/gridViewRed"
android:layout_width="wrap_content"
android:layout_height="350dp"
android:layout_alignParentLeft="true"
android:layout_below="@id/gridLabel__red"
android:columnWidth="40dp"
android:numColumns="3"
android:verticalSpacing="10dp"
android:horizontalSpacing="7dp"
android:gravity="center"
android:background="@color/white"
>
</GridView>
</RelativeLayout>
</ScrollView>
RedScorerFragment.java
import com.actionbarsherlock.app.SherlockFragment;
import android.content.Context;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.view.View.OnTouchListener;
import android.view.inputmethod.InputMethodManager;
public class RedScorerFragment extends SherlockFragment {
LayoutInflater infl;
GridView mGrid;
EditText mText;
int R1C1, R1C2, R1C3;
View tView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
infl = inflater;
//super.onCreate(savedInstanceState);
View mView = inflater.inflate(R.layout.fragment_score_red, container, false);
mGrid = (GridView) mView.findViewById(R.id.gridViewRed);
tView = container.getRootView();
final InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mView.getApplicationWindowToken(), 0);
/*mGrid.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_MOVE)
return true;
return false;
}
});*/
if(savedInstanceState != null)
{
R1C1 = savedInstanceState.getInt("R1C1");
R1C2 = savedInstanceState.getInt("R1C2");
R1C3 = savedInstanceState.getInt("R1C3");
Log.d("savedd R1C1 ", String.valueOf(R1C1));
Log.d("savedd R1C2 ", String.valueOf(R1C2));
Log.d("savedd R1C3 ", String.valueOf(R1C3));
}
mGrid.setAdapter(new ImageAdapter(getActivity()));
return mView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
if(savedInstanceState != null)
{
R1C1 = savedInstanceState.getInt("R1C1", 0);
R1C2 = savedInstanceState.getInt("R1C2", 0);
R1C3 = savedInstanceState.getInt("R1C3", 0);
Log.v("saved R1C1 ", String.valueOf(R1C1));
Log.v("saved R1C2 ", String.valueOf(R1C2));
Log.v("saved R1C3 ", String.valueOf(R1C3));
}
//Log.v("saved R1C1 ", String.valueOf(R1C1));
//Log.v("saved R1C2 ", String.valueOf(R1C2));
//Log.v("saved R1C3 ", String.valueOf(R1C3));
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
//for(int i=0;i<mGrid.getChildCount(); i++)
Log.v("Saving", String.valueOf(mGrid.getAdapter().getItem(0)));
//Log.v("Saving", mGrid.getItemAtPosition(2).toString());
Integer temp = (Integer) mGrid.getAdapter().getItem(0);
int temp2;
if(temp != null)
{
temp2 = temp;
Log.v("temp2", String.valueOf(temp2));
savedInstanceState.putInt("R1C1", temp2);
}
else
Log.v("temp2", "Temp was null");
mText = (EditText)tView.findViewById(R.id.weightedRed__red);
Log.d("weighted Red", mText.getText().toString() );
EditText oText = (EditText)tView.findViewById(R.id.grid_item_edit_text_red);
Log.d("red edit text", oText.getText().toString() );
EditText lText = (EditText)tView.findViewById(R.id.grid_item_edit_text_blue);
Log.d("blue edit text", lText.getText().toString() );
//savedInstanceState.putInt("R1C2", (Integer) mGrid.getAdapter().getItem(4) );
//savedInstanceState.putInt("R1C3", (Integer) mGrid.getAdapter().getItem(2) );
}
public class ImageAdapter extends BaseAdapter{
Context context;
public ImageAdapter(Context context)
{
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View myView = convertView;
//LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(convertView == null)
{
LayoutInflater li = infl;
myView= li.inflate(R.layout.grid_items, null);
EditText editText = (EditText) myView.findViewById(R.id.grid_item_edit_text_red);
}
return myView;
}
@Override
public int getCount() {
return 9;//only 9
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
}
I tried changing the get Item method to
@Override
public Object getItem(int position) {
return mGrid.getItemAtPosition(position);
}
but now it crashes when I press the home button and i get a stack overflow error
回答1:
In addition to TextWatchers, you could simply add all your Editexts to an array, and then when you need your text from them, you could simply cycle through the array and call getText().toString(); on all of them.
public class ImageAdapter extends BaseAdapter{
Context context;
EditText[] etCollection = new EditText[getCount()];
public ImageAdapter(Context context)
{
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View myView = convertView;
//LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(convertView == null)
{
LayoutInflater li = infl;
myView= li.inflate(R.layout.grid_items, null);
}
EditText editText = (EditText) myView.findViewById(R.id.grid_item_edit_text_red);
//^ moved to outside the null block
etCollection[position] = editText;
return myView;
}
回答2:
I'm not shure if this is the absolute and eligant solution, but you can try to add to your adapter a value container (like a dataset) for all the TextView's (it could be an ordinary ArrayList or somthing similar).
Then set a TextWatcher on every EditText:
mEditText.addTextChangedListener(new TextWatcher() {...});
And change the value of the list item every time the EditText value is changed.
In you onSaveInstanceState() method all you need is to retrive the value from the adapter.
The rest I think is simple.
Edit (Just to be clear)
Your adapter should luck somthing similar:
public class MyAdapter extends BaseAdapter {
// All the fancy stuff
List<String> dataset;
@Override
public View getView(...) {
//... othe code
mEditText.addTextChangedListener(new MyTextWatcher(position));
}
private class MyTextWatcher implements TextWatcher {
int index;
public MyTextWatcher(int index) {
this.index = index;
}
@Override
public void afterTextChanged(Editable s) {
dataset.set(index, s.toString());
}
}
}
来源:https://stackoverflow.com/questions/14012181/how-to-get-values-from-grid-view