我有一个默认文本和图像放在我的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>
谢谢,但那不行。我不能将方法放在类中(我认为只是一个活动或片段),因为由于某种原因,inflater代码没有到达方法中的EditText,因为我一直在我的'mediaTitle'变量上得到空指针,因为它在我尝试打开片段时崩溃。我不认为我想把整个代码放在'getView()'(这会使'mediaTitle'可达),因为它只是第一次设置空视图,没有动态用户交互。 – Azurespot 2015-02-08 05:09:49
另外'getApplicationContext()'在片段或类中都不起作用。 'getActivity()'适用于片段,'getContext()'适用于该类。尽管我改变了我的常量,只是为了'String',但不幸的是没有解决我的问题。 – Azurespot 2015-02-08 05:18:40
将getActivity()作为上下文传递给适配器并使用它们 – 2015-02-08 05:32:21