Fragment 和 main 之间的通信 activity

Communication between Fragment and main activity

我正在尝试实现 activity 和片段之间的通信,但是我不知道该怎么做。我不断收到以下错误:

01-19 16:15:01.838    6105-6105/com.example.torresj.unlockdemo E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at com.example.torresj.unlockdemo.HomeFragment.onClick(HomeFragment.java:42)
            at android.view.View.performClick(View.java:4475)
            at android.view.View$PerformClick.run(View.java:18786)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:176)
            at android.app.ActivityThread.main(ActivityThread.java:5419)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
            at dalvik.system.NativeStart.main(Native Method)

第 42 行是我的片段 class 的 someEventListener.someEvent(final_str);。来源如下:

public class HomeFragment extends Fragment {

    public interface onSomeEventListener {
        public void someEvent(String s);
    }
    onSomeEventListener someEventListener;

    public HomeFragment() {}
    View rootView;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.fragment_home, container, false);
        Button Send = (Button) rootView.findViewById(R.id.sendbtn);

        final EditText Username = (EditText) rootView.findViewById(R.id.editText);
        final EditText Password = (EditText) rootView.findViewById(R.id.editText2);

        Send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s = Username.getText().toString();
                String s2 = Password.getText().toString();
                String final_str = s + ":" + s2;

                someEventListener.someEvent(final_str);
            }
        });

        return rootView;
    }

}

我也已将我的主要 activity 声明为:

public class MainActivity extends ActionBarActivity implements HomeFragment.onSomeEventListener

在我的 main activity 底部是 ff 函数:

@Override
    public void someEvent(String s) {
        String y = s;
        Log.i("Frag", s);
    }

我不确定为什么会产生错误。在我的片段 class.

中调用 someEventListener.someEvent(final_str); 之前字符串是正确的

您需要为您的片段设置侦听器。将此代码添加到您的 HomeFragment.

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            someEventListener = (OnSomeEventListener) activity;
        } catch (ClassCastException e) {
            throw new IllegalArgumentException("Activity must implement HomeFragment.OnSomeEventListener!");
        }
    }

此外,根据 Eugen Pechanec 的建议,清除 onDetach 中的引用以防止潜在的内存泄漏。

@Override
public void onDetach() {
    super.onDetach();
    someEventListener = null;
}