我刚刚开始了解Android开发前一天,我正在观看你的Bucky。他正在使用onAttach(活动活动),但是因为他的视频来自两年前这个方法已弃用,所以我需要使用onAttach(Context context)。 事情是,当使用Activity时,应用程序运行得很好,虽然当我使用Context时,只要按下按钮就会崩溃。 我该如何解决这个问题?
错误:
01-29 22:28:59.156 5854-5854/? E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at com.jruivo.mymemegenerator.TopSectionFragment.buttonClicked(TopSectionFragment.java:53)
at com.jruivo.mymemegenerator.TopSectionFragment.access$000(TopSectionFragment.java:15)
at com.jruivo.mymemegenerator.TopSectionFragment$1.onClick(TopSectionFragment.java:45)
TopSectionFragment类:
public class TopSectionFragment extends Fragment {
private static EditText topTextInput;
private static EditText bottomTextInput;
TopSectionListener activityCommander;
public interface TopSectionListener {
public void createMeme(String top, String bottom);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
activityCommander = (TopSectionListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString());
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.top_section_fragment, container, false);
topTextInput = (EditText) view.findViewById(R.id.topTextInput);
bottomTextInput = (EditText) view.findViewById(R.id.bottomTextInput);
final Button button = (Button) view.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
buttonClicked(v);
}
});
return view;
}
private void buttonClicked(View v) {
activityCommander.createMeme(topTextInput.getText().toString(), bottomTextInput.getText().toString());
}
}
编辑:将“knap”更改为“button”,将代码复制到此处时出错。
答案 0 :(得分:2)
这很可能是因为您的Android设备不是API 23+,并且您使用的方法版本已在API 23中添加。
您需要覆盖onAttach
的{{1}}或切换到使用包含支持片段管理器和片段的支持库。这应该正确调用onAttach(上下文上下文),即使在API 23之前的设备上也是如此。
您可以尝试通过在该方法中使用Activity
向logcat写一些东西来证明自己没有达到onAttach(Context context)
。
答案 1 :(得分:1)
错误是knapp.set ....将其更改为按钮,功能应该没问题。
final Button button = (Button) view.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
buttonClicked(v);
}
}
);
您正在使用未初始化的变量knapp
,因此会出现NullPointerException。
答案 2 :(得分:1)
NullPointer归因于似乎没有初始化的knapp
变量 - 因此是例外。
将knapp.setOnClickListener
更改为button.setOnClickListener
答案 3 :(得分:1)
我希望您的活动实现TopSectionListener
。如果是这样,试试这个。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.top_section_fragment, container, false);
try {
activityCommander = (TopSectionListener) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException(context.toString());
}
topTextInput = (EditText) view.findViewById(R.id.topTextInput);
bottomTextInput = (EditText) view.findViewById(R.id.bottomTextInput);
final Button button = (Button) view.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
buttonClicked(v);
}
});
return view;
}
删除这些行,
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
activityCommander = (TopSectionListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString());
}
}
答案 4 :(得分:0)
出于某种原因,我交换了导入,现在它正常工作..我不知道这是否正确。
发件人强>: import android.app.Fragment;
要强> import android.support.v4.app.Fragment;