我正在尝试在片段和自定义列表视图适配器之间实现一个接口,如下所示。然而,每当调用onClick侦听器时,我都会得到一个空指针。这是必要的代码。 对话框片段:
public class MoodDialog extends DialogFragment implements OnClickListener,
EmoticonClickListener {
ImageView emoticon;
EditText mood;
private Bitmap[] emoticons;
EmoticonClickListener mListener;
GridView emoticonsGrid;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.fragment_mood, null);
ArrayList<String> emoticonsInAPage = new ArrayList<String>();
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(view)
// Add action buttons
.setPositiveButton("Update",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// sign in the user ...
}
})
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
MoodDialog.this.getDialog().cancel();
}
});
for (int i = 0; i <= 19; i++) {
emoticonsInAPage.add(mThumbIds[i]);
}
emoticonsGrid = (GridView) view.findViewById(R.id.mood_emoticons_grid);
MoodEmoticonImageAdapter adapter = new MoodEmoticonImageAdapter(
getActivity().getApplicationContext(), emoticonsInAPage,
mListener);
emoticonsGrid.setAdapter(adapter);
mood = (EditText) view.findViewById(R.id.mood_edittext_mood);
emoticon = (ImageView) view.findViewById(R.id.mood_imageView_emoticon);
emoticon.setOnClickListener(this);
return builder.create();
}
@Override
public void emoticonClickedIndex(final String index) {
ImageGetter imageGetter = new ImageGetter() {
public Drawable getDrawable(String source) {
StringTokenizer st = new StringTokenizer(index, ".");
Drawable d = new BitmapDrawable(getResources(),
emoticons[Integer.parseInt(st.nextToken()) - 1]);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
// d.setBounds(0, 0,35, 35);
return d;
}
};
Spanned cs = Html.fromHtml("<img src ='" + index + "'/>", imageGetter,
null);
int cursorPosition = mood.getSelectionStart();
mood.getText().insert(cursorPosition, cs);
emoticonsGrid.setVisibility(View.GONE);
}
}
自定义listView适配器:
package com.gigavia.gigit;
import java.io.InputStream;
import java.util.ArrayList;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
public class EmoticonsGridAdapter extends BaseAdapter{
private ArrayList<String> paths;
private int pageNumber;
Context mContext;
KeyClickListener mListener;
public EmoticonsGridAdapter(Context context, ArrayList<String> paths, int pageNumber, KeyClickListener listener) {
this.mContext = context;
this.paths = paths;
this.pageNumber = pageNumber;
this.mListener = listener;
}
public View getView(int position, View convertView, ViewGroup parent){
View v = convertView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.emoticons_item, null);
}
final String path = paths.get(position);
ImageView image = (ImageView) v.findViewById(R.id.item);
image.setImageBitmap(getImage(path));
image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mListener.keyClickedIndex(path);
}
});
return v;
}
@Override
public int getCount() {
return paths.size();
}
@Override
public String getItem(int position) {
return paths.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public int getPageNumber () {
return pageNumber;
}
private Bitmap getImage (String path) {
AssetManager mngr = mContext.getAssets();
InputStream in = null;
try {
in = mngr.open("emoticons/" + path);
} catch (Exception e){
e.printStackTrace();
}
//BitmapFactory.Options options = new BitmapFactory.Options();
//options.inSampleSize = chunks;
Bitmap temp = BitmapFactory.decodeStream(in ,null ,null);
return temp;
}
public interface KeyClickListener {
public void keyClickedIndex(String index);
}
}
当调用对话框并单击表情符号时,我收到此错误
06-05 21:04:57.493: E/AndroidRuntime(2588): FATAL EXCEPTION: main
06-05 21:04:57.493: E/AndroidRuntime(2588): java.lang.NullPointerException
06-05 21:04:57.493: E/AndroidRuntime(2588): at com.gigavia.gigit.MoodEmoticonImageAdapter$1.onClick(MoodEmoticonImageAdapter.java:63)
06-05 21:04:57.493: E/AndroidRuntime(2588): at android.view.View.performClick(View.java:4204)
06-05 21:04:57.493: E/AndroidRuntime(2588): at android.view.View$PerformClick.run(View.java:17355)
06-05 21:04:57.493: E/AndroidRuntime(2588): at android.os.Handler.handleCallback(Handler.java:725)
06-05 21:04:57.493: E/AndroidRuntime(2588): at android.os.Handler.dispatchMessage(Handler.java:92)
06-05 21:04:57.493: E/AndroidRuntime(2588): at android.os.Looper.loop(Looper.java:137)
06-05 21:04:57.493: E/AndroidRuntime(2588): at android.app.ActivityThread.main(ActivityThread.java:5041)
06-05 21:04:57.493: E/AndroidRuntime(2588): at java.lang.reflect.Method.invokeNative(Native Method)
06-05 21:04:57.493: E/AndroidRuntime(2588): at java.lang.reflect.Method.invoke(Method.java:511)
06-05 21:04:57.493: E/AndroidRuntime(2588): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
第63行
mListener.keyClickedIndex(path);
我将非常感谢帮助解决这个问题。谢谢。
答案 0 :(得分:0)
基于Log的这一部分:
.gigit.MoodEmoticonImageAdapter$1.onClick(MoodEmoticonImageAdapter.java:63)
它表示异常是由onClick()
的匿名内部类($1
)的MoodEmoticonImageAdapter
方法引起的。您正在向我们展示不同适配器的代码。
无论如何,错误是由于您传递的是未初始化的数据成员(
EmoticonClickListener mListener),当您应该传递this
作为参数时,如下所示:
MoodEmoticonImageAdapter adapter = new MoodEmoticonImageAdapter(
getActivity().getApplicationContext(), emoticonsInAPage, this);
由于MoodDialog
正在实施EmoticonClickListener
,您希望将其作为参考传递,以便MoodEmoticonImageAdapter
可以调用方法emoticonClickedIndex()
。