使用Context崩溃app,Activity很好吗? onAttach

时间:2016-01-29 22:44:52

标签: android android-layout android-fragments

我刚刚开始了解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”,将代码复制到此处时出错。

5 个答案:

答案 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;