gpt4 book ai didi

java - 添加字符串资源而不是静态数据

转载 作者:行者123 更新时间:2023-12-02 12:00:10 25 4
gpt4 key购买 nike

我正在尝试添加一些字符串资源来替换内容字符串,但我似乎无法访问它们,因为它是一个静态类。如何从非静态上下文向 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;
}
}

//虚拟内容类

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

//列表 fragment

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() {
}
}

最佳答案

检查下面的代码。从 Activity 调用此类时,您可以传递上下文,然后就可以访问字符串资源。

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() {
}
}

关于java - 添加字符串资源而不是静态数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47324925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com