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;
}
我正在尝试实现 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;
}