我正在尝试添加一些字符串资源来替换Content字符串,但我似乎无法访问它们,因为它是一个静态类。如何从非静态上下文向DummyItem添加项目?
我编辑了添加我在另一篇文章中看到的自定义上下文类。 它现在有效但自定义上下文类会抛出警告 - 不要将Android上下文类放在静态字段中;这是内存泄漏。
这实际上是内存泄漏吗?怎么样?我能解决吗?
//自定义上下文类
public class MyCustomContext extends Application {
private static Context context;
public void onCreate() {
super.onCreate();
MyCustomContext.context = getApplicationContext();
}
public static Context getAppContext() {
return MyCustomContext.context;
}
}
// Dummy Content Class
public class DummyContent {
public static final List<DummyItem> ITEMS = new ArrayList<>();
public static final Map<String, DummyItem> ITEM_MAP = new HashMap<>(5);
static {
addItem(new DummyItem("1", R.drawable.p1, "Item #1", "Author A", res.MyCustomContext.getAppContext().getString(R.string.ContentA));
addItem(new DummyItem("2", R.drawable.p2, "Item #2", "Author B", res.MyCustomContext.getAppContext().getString(R.string.ContentB));
addItem(new DummyItem("3", R.drawable.p3, "Item #3", "Author C", res.MyCustomContext.getAppContext().getString(R.string.ContentC)));
}
private static void addItem(DummyItem item) {
ITEMS.add(item);
ITEM_MAP.put(item.id, item);
}
public static class DummyItem {
public final String id;
public final int photoId;
public final String title;
public final String author;
public final String content;
public DummyItem(String id, int photoId, String title, String author, String content) {
this.id = id;
this.photoId = photoId;
this.title = title;
this.author = author;
this.content = content;
}
}
}
//列出片段
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ListFragment;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.BitmapImageViewTarget;
import com.app.test.R;
import com.app.test.DummyContent;
/**
* Shows a list of all available quotes.
*/
public class PortfolioListFragment extends ListFragment {
private Callback callback = dummyCallback;
/**
* A callback interface. Called whenever a item has been selected.
*/
public interface Callback {
void onItemSelected(String id);
}
/**
* A dummy no-op implementation of the Callback interface. Only used when no active Activity is present.
*/
private static final Callback dummyCallback = new Callback() {
@Override
public void onItemSelected(String id) {
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new MyListAdapter());
setHasOptionsMenu(true);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
// notify callback about the selected list item
callback.onItemSelected(DummyContent.ITEMS.get(position).id);
}
/**
* onAttach(Context) is not called on pre API 23 versions of Android.
* onAttach(Activity) is deprecated but still necessary on older devices.
*/
@TargetApi(23)
@Override
public void onAttach(Context context) {
super.onAttach(context);
onAttachToContext(context);
}
/**
* Deprecated on API 23 but still necessary for pre API 23 devices.
*/
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
onAttachToContext(activity);
}
}
/**
* Called when the fragment attaches to the context
*/
protected void onAttachToContext(Context context) {
if (!(context instanceof Callback)) {
throw new IllegalStateException("Activity must implement callback interface.");
}
callback = (Callback) context;
}
private class MyListAdapter extends BaseAdapter {
@Override
public int getCount() {
return DummyContent.ITEMS.size();
}
@Override
public Object getItem(int position) {
return DummyContent.ITEMS.get(position);
}
@Override
public long getItemId(int position) {
return DummyContent.ITEMS.get(position).id.hashCode();
}
@Override
public View getView(int position, View convertView, ViewGroup container) {
if (convertView == null) {
convertView = LayoutInflater.from(getActivity()).inflate(R.layout.list_item_article, container, false);
}
final DummyContent.DummyItem item = (DummyContent.DummyItem) getItem(position);
((TextView) convertView.findViewById(R.id.article_title)).setText(item.title);
((TextView) convertView.findViewById(R.id.article_subtitle)).setText(item.author);
final ImageView img = (ImageView) convertView.findViewById(R.id.thumbnail);
Glide.with(getActivity()).load(item.photoId).asBitmap().into(new BitmapImageViewTarget(img) {
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable = RoundedBitmapDrawableFactory.create(getActivity().getResources(), resource);
circularBitmapDrawable.setCircular(true);
img.setImageDrawable(circularBitmapDrawable);
}
});
return convertView;
}
}
public PortfolioListFragment() {
}
}
答案 0 :(得分:1)
检查以下代码。您可以在从活动中调用此类时传递上下文,而不是可以访问String资源。
public class DummyContent {
/**
* An array of sample items.
*/
private Context context ;
public DummyContent(Context context){
this.context = context ;
addStaticItem();
}
public static List<DummyItem> ITEMS = new ArrayList<>();
/**
* A map of sample items. Key: sample ID; Value: Item.
*/
public static Map<String, DummyItem> ITEM_MAP = new HashMap<>(5);
public void addStaticItem(){
addItem(new DummyItem("1", R.drawable.ic_launcher, "Item #1", "Author A", "Content A"));
addItem(new DummyItem("2", R.drawable.ic_launcher, "Item #2", "Author B","Content B"));
addItem(new DummyItem("3", R.drawable.ic_launcher, "Item #3", "Author C", context.getResources().getString(R.string.text_ok) ));
}
private void addItem(DummyItem item) {
ITEMS.add(item);
ITEM_MAP.put(item.id, item);
}
public class DummyItem {
public String id;
public int photoId;
public String title;
public String author;
public String content;
public DummyItem(String id, int photoId, String title, String author, String content) {
this.id = id;
this.photoId = photoId;
this.title = title;
this.author = author;
this.content = content;
}
}
}
以下是您的PortfolioListFragment
课程:
public class PortfolioListFragment extends ListFragment {
private Callback callback = dummyCallback;
/**
* A callback interface. Called whenever a item has been selected.
*/
public interface Callback {
void onItemSelected(String id);
}
/**
* A dummy no-op implementation of the Callback interface. Only used when no active Activity is present.
*/
private static final Callback dummyCallback = new Callback() {
@Override
public void onItemSelected(String id) {
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DummyContent dummyContent = new DummyContent(getContext());
setListAdapter(new MyListAdapter());
setHasOptionsMenu(true);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
// notify callback about the selected list item
callback.onItemSelected(DummyContent.ITEMS.get(position).id);
}
/**
* onAttach(Context) is not called on pre API 23 versions of Android.
* onAttach(Activity) is deprecated but still necessary on older devices.
*/
@TargetApi(23)
@Override
public void onAttach(Context context) {
super.onAttach(context);
onAttachToContext(context);
}
/**
* Deprecated on API 23 but still necessary for pre API 23 devices.
*/
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
onAttachToContext(activity);
}
}
/**
* Called when the fragment attaches to the context
*/
protected void onAttachToContext(Context context) {
if (!(context instanceof Callback)) {
throw new IllegalStateException("Activity must implement callback interface.");
}
callback = (Callback) context;
}
private class MyListAdapter extends BaseAdapter {
@Override
public int getCount() {
return DummyContent.ITEMS.size();
}
@Override
public Object getItem(int position) {
return DummyContent.ITEMS.get(position);
}
@Override
public long getItemId(int position) {
return DummyContent.ITEMS.get(position).id.hashCode();
}
@Override
public View getView(int position, View convertView, ViewGroup container) {
if (convertView == null) {
convertView = LayoutInflater.from(getActivity()).inflate(R.layout.list_item_article, container, false);
}
final DummyContent.DummyItem item = (DummyContent.DummyItem) getItem(position);
((TextView) convertView.findViewById(R.id.article_title)).setText(item.title);
((TextView) convertView.findViewById(R.id.article_subtitle)).setText(item.author);
final ImageView img = (ImageView) convertView.findViewById(R.id.thumbnail);
Glide.with(getActivity()).load(item.photoId).asBitmap().into(new BitmapImageViewTarget(img) {
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable = RoundedBitmapDrawableFactory.create(getActivity().getResources(), resource);
circularBitmapDrawable.setCircular(true);
img.setImageDrawable(circularBitmapDrawable);
}
});
return convertView;
}
}
public PortfolioListFragment() {
}
}
答案 1 :(得分:0)
那么,你不能使用findViewById(R.string.myString)
资源,因为它不是最终资源?不确定这是不是你在问什么。