私の活動にはこのインターフェースがあります。
public interface LogoutUser {
void logout();
}
私のフラグメントはこのインターフェースを実装しているので、私のフラグメントでは、これを持っています:
@Override
public void logout() {
// logout
}
私の活動の中で私は電話します
mLogoutUser.logout();
ここで、mLogoutUser
はタイプLogoutUserインターフェースです。
私の問題は、nullであるmLogoutUser
オブジェクトです。どのように初期化できますか?
ありがとうございました!
getFragmentById()
またはgetFragmentByTag()
を使用してフラグメントへの参照を取得する必要があります
getFragmentManager().findFragmentById(R.id.example_fragment);
コメントで述べたように、フラグメントでonAttach
メソッドを使用してこの問題を解決しましたが、この方法では、フラグメントでコールバックフィールド(この場合はmLogoutUser)を宣言し、この方法で初期化する必要があります:
public class MyFragment extends ListFragment {
LogoutUser mLogoutUser;
// Container Activity must implement this interface
public interface LogoutUser {
public void logout();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mLogoutUser = (LogoutUser) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement LogoutUser");
}
}
...
}
詳細は 他のフラグメントとの通信 を参照してください。
ただし、ケースがアクティビティで宣言されたフィールドである場合は、アクティビティのonAttachFragment
メソッドを使用して、次のようにリスナーフィールドを初期化できます。
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
mLogoutUser = (LogoutUser) fragment;
}
また、イベントバスを使用して、フラグメントとアクティビティ間のこの通信を行うことができます。オプションは、Squareの Ottoライブラリ です。
フラグメントからアクティビティへのコールバックを作成するためのサンプル
public interface CallBackListener {
void onCallBack();// pass any parameter in your onCallBack which you want to return
}
CallBackFragment.class
public class CallBackFragment extends Fragment {
private CallBackListener callBackListener;
public CallBackFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_call_back, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//getActivity() is fully created in onActivityCreated and instanceOf differentiate it between different Activities
if (getActivity() instanceof CallBackListener)
callBackListener = (CallBackListener) getActivity();
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Button btn = (Button) view.findViewById(R.id.btn_click);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(callBackListener != null)
callBackListener.onCallBack();
}
});
}
}
CallbackHandlingActivity.class
public class CallbackHandlingActivity extends AppCompatActivity implements CallBackListener
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_all_user);
}
@Override
public void onCallBack() {
Toast.makeText(mContext,"onCallback Called",Toast.LENGTH_LONG).show();
}
}