1

我有一个默认文本和图像放在我的GridView中,当用户单击EditText时,它们应该能够更改该值并保存SharedPreferences,所以即使该应用程序被杀害,EditText将保持更改。来自EditText(来自GridView)的片段中的用户输入不是持久的

但是,这是行不通的。当我杀了应用程序并返回时,EditText再次显示默认值。我的猜测是这是因为我如何使用LayoutInflater,尽管我不确定,因为012dAndroid文档不是很明确。我在我的GridView适配器中使用一次充气器,一次在我的Fragment布局中,然后在Fragment中再次使用以获得EditText,以便用户可以更改它。我应该只使用2个充气器(如使用适配器充气器两次,但如何?)我认为我的SharedPreferences信息是正确的,但我可能是错的。有什么建议么?谢谢。

CuteCollectionFragment.java

package org.azurespot.cutecollection; 

import android.app.Fragment; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.EditText; 
import android.widget.GridView; 
import android.widget.ImageView; 

import org.azurespot.R; 

/** 
* Created by mizu on 1/26/15. 
*/ 
public class CuteCollectionFragment extends Fragment { 

    GridView gridView; 
    GridViewAdapter gridViewAdapter; 
    String newTitle; 
    EditText mediaTitle; 
    ImageView mediaItem; 

    protected static final String MEDIA_TITLE = "Media Title"; 


    public CuteCollectionFragment(){} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_cute_collection, 
                  container, false); 

     // with fragments, make sure you include the rootView when finding id 
     gridView=(GridView)rootView.findViewById(R.id.gridView); 
     // Create the Custom Adapter Object 
     gridViewAdapter = new GridViewAdapter(getActivity()); 
     // Set the Adapter to GridView 
     gridView.setAdapter(gridViewAdapter); 

     // get default the Title and Image variables for use 
     LayoutInflater inflater2 = LayoutInflater.from(GridViewAdapter.context); 
     View gridRow = inflater2.inflate(R.layout.grid_row, null); 
     mediaTitle = (EditText) gridRow.findViewById(R.id.media_title); 
     mediaItem = (ImageView) gridRow.findViewById(R.id.media_item); 

     // Load prefs from previous saves 
     loadTitlePreferences(); 

     // Handling touch/click Event on GridView Item 
     gridView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { 

      // Code to show photo in dialog box 
      } 
     }); 

     return rootView; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     // When "Done" enter key pressed on soft keyboard, Title prefs are saved 
     mediaTitle.setOnKeyListener(new View.OnKeyListener() { 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 

       if (event.getAction() == KeyEvent.ACTION_DOWN) { 
        switch (keyCode) { 
         case KeyEvent.KEYCODE_DPAD_CENTER: 
         case KeyEvent.KEYCODE_ENTER: 
          saveTitlePreferences(); 
          return true; 
         default: 
          break; 
        } 
       } 

       return false; 
      } 

     }); 
    } 

    private void loadTitlePreferences() { 

     SharedPreferences sp = getActivity().getSharedPreferences(MEDIA_TITLE, 0); 
     String name = sp.getString("Media Title", newTitle); 

     mediaTitle.setText(name); 
    } 

    private void saveTitlePreferences(){ 

     newTitle = mediaTitle.getText().toString(); 
     // since using a fragment, must put getActivity() before method 
     SharedPreferences sp = getActivity() 
       .getSharedPreferences(MEDIA_TITLE, 0); 

     SharedPreferences.Editor editor = sp.edit(); 
     editor.putString("Media Title", newTitle); 
     // apply() saves in the background, whereas commit(); 
     // saves immediately 
     editor.commit(); 
    } 

} 

GridViewAdapter.java

package org.azurespot.cutecollection; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.ImageView; 

import org.azurespot.R; 

/** 
* Created by mizu on 2/5/15. 
*/ 
public class GridViewAdapter extends ArrayAdapter { 

    public static Context context; 
    private EditText mediaTitle; 
    private ImageView mediaItem; 


    public GridViewAdapter(Context context) { 
     super(context, 0); 
     this.context = context; 

    } 

    public int getCount() { 
     return 24; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View row = convertView; 

     if (row == null) 
     { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      row = inflater.inflate(R.layout.grid_row, parent, false); 

      mediaTitle = (EditText) row.findViewById(R.id.media_title); 
      mediaItem = (ImageView) row.findViewById(R.id.media_item); 

      mediaTitle.setText("Add title"); 
      mediaItem.setImageResource(R.drawable.ic_collection_add); 

     } 

     return row; 
    } 
} 

fragment_cute_collection.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#2198bb" > 


    <GridView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/gridView" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:layout_margin="10dp" 
     android:columnWidth="100dp" 
     android:gravity="center" 
     android:numColumns="auto_fit" 
     android:stretchMode="columnWidth" 
     android:scrollbarStyle="outsideOverlay" 
     android:verticalScrollbarPosition="right" 
     android:background="@drawable/button_border" /> 

</RelativeLayout> 

grid_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <ImageView 
     android:id="@+id/media_item" 
     android:layout_width="90dp" 
     android:layout_height="90dp" 
     android:layout_gravity="center" 
     android:src="@drawable/ic_launcher" > 
    </ImageView> 

    <EditText 
     android:id="@+id/media_title" 
     android:layout_width="105dp" 
     android:layout_height="40dp" 
     android:textSize="15sp" 
     android:gravity="center" 
     android:maxLines="1" 
     android:maxLength="10" 
     android:inputType="text" 
     android:imeOptions="actionDone" 
     android:layout_gravity="center"> 
    </EditText> 

</LinearLayout> 

回答

0

请使用加载和保存在优先级Adapter

和与优先级值的常值

mediaTitle.setText("Add title"); 

偏好代码使用更新mediaTitle不是本

SharedPreferences mSharedPreferences =getApplicationContext().getSharedPreferences("pref", MODE_PRIVATE); 
     /* 
     * TO WRITE VALUES INTO THE PREFERENCE FILE 
     */ 


     //get Editor object using sharedPreference edit() Method 

     Editor mEditor= mSharedPreferences.edit(); 
     //set boolean Values into preference files 


     mEditor.putString("stringValue", "hello"); 
     //set integer value into the preference file 

     mEditor.commit(); 


     /* 
     * TO READ THE VALUES FROM THE PREFERENCE FILE 
     */ 

     //get the String value from preference 
     String stringValue=mSharedPreferences.getString("stringValue", "default value"); 

Detail

+0

谢谢,但那不行。我不能将方法放在类中(我认为只是一个活动或片段),因为由于某种原因,inflater代码没有到达方法中的EditText,因为我一直在我的'mediaTitle'变量上得到空指针,因为它在我尝试打开片段时崩溃。我不认为我想把整个代码放在'getView()'(这会使'mediaTitle'可达),因为它只是第一次设置空视图,没有动态用户交互。 – Azurespot 2015-02-08 05:09:49

+0

另外'getApplicationContext()'在片段或类中都不起作用。 'getActivity()'适用于片段,'getContext()'适用于该类。尽管我改变了我的常量,只是为了'String',但不幸的是没有解决我的问题。 – Azurespot 2015-02-08 05:18:40

+0

将getActivity()作为上下文传递给适配器并使用它们 – 2015-02-08 05:32:21