フラグメント内で使うメッセージボード。
メッセージボードのボタンをタップするとフラグメントに通知を送る。
Bundle args で授受。
public class MyMessage {
public interface ClickListener { // リスナーのインターフェイスを作成
void onClick(Bundle args); // バンドルで渡す
}
private ClickListener mClickListener;
public void setClickListener(final ClickListener listener) {
mClickListener = listener;
}
private View.OnClickListener mMessageClick = new View.OnClickListener() {
@Override
public void onClick(View v) { // メッセージボードのボタンがタップされたら通知する。
offMessageBoard();
Bundle args = new Bundle();
args.putInt("ID", mMessageId); // 呼び出し元のID
args.putInt("param", mMessageParam); // パラメータ数
args.putInt("V_ID", v.getId()); // タップしたView の ID
mMessageId = -1;
mClickListener.onClick( args );
}
};
private ConstraintLayout mLayout;
private TextView mMessageTextView = null;
private TextView mAcceptedTextView = null;
private TextView mCancelTextView = null;
private TextView mDoneTextView = null;
private int mMessageId = 0;
private int mMessageParam = 0;
@SuppressLint({"NonConstantResourceId", "ResourceType"})
public MyMessage(Activity activity) {
mLayout = activity.findViewById(R.id.message_layout);
mMessageTextView = ( TextView ) activity.findViewById(R.id.message_text);
mAcceptedTextView = ( TextView ) activity.findViewById(R.id.key_accepted);
mAcceptedTextView.setOnClickListener(mMessageClick);
mCancelTextView = ( TextView ) activity.findViewById(R.id.key_cancel);
mCancelTextView.setOnClickListener(mMessageClick);
mDoneTextView = ( TextView ) activity.findViewById(R.id.key_done);
mDoneTextView.setOnClickListener(mMessageClick);
}
@SuppressLint("SetTextI18n")
public void setMessage(int id, String mes ) {
mMessageId = id; // 呼び出し元のID
mMessageParam = 0; // パラメータ数
mMessageTextView.setText(mes);
mAcceptedTextView.setVisibility( View.GONE );
mCancelTextView.setVisibility( View.GONE );
mDoneTextView.setText("DONE");
mDoneTextView.setVisibility( View.VISIBLE );
mLayout.setVisibility(View.VISIBLE);
}
public void setMessage( int id, String mes, String param1 ) {
mMessageId = id;
mMessageParam = 1;
mMessageTextView.setText(mes);
mAcceptedTextView.setText(param1);
mAcceptedTextView.setVisibility( View.VISIBLE );
mCancelTextView.setVisibility( View.GONE );
mDoneTextView.setVisibility( View.GONE );
mLayout.setVisibility(View.VISIBLE);
}
public void setMessage( int id, String mes, String param1, String param2 ) {
mMessageId = id;
mMessageParam = 2;
mMessageTextView.setText(mes);
mAcceptedTextView.setText(param1);
mAcceptedTextView.setVisibility( View.VISIBLE );
mCancelTextView.setText(param2);
mCancelTextView.setVisibility( View.VISIBLE );
mDoneTextView.setVisibility( View.GONE );
mLayout.setVisibility(View.VISIBLE);
}
public void setMessage( int id, String mes, String param1, String param2, String param3 ) {
mMessageId = id;
mMessageParam = 3;
mMessageTextView.setText(mes);
mAcceptedTextView.setText(param1);
mAcceptedTextView.setVisibility( View.VISIBLE );
mCancelTextView.setText(param2);
mCancelTextView.setVisibility( View.VISIBLE );
mDoneTextView.setText(param3);
mDoneTextView.setVisibility( View.VISIBLE );
mLayout.setVisibility(View.VISIBLE);
}
public boolean isMessageBoard() { return ( mLayout.getVisibility() == View.VISIBLE ); }
private void offMessageBoard() { mLayout.setVisibility( View.GONE ); }
public void finish() {
mMessageTextView = null;
mAcceptedTextView = null;
mCancelTextView = null;
mDoneTextView = null;
mMessageClick = null;
mLayout = null;
}
}
public class MyFragment extends Fragment {
// 省略
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mMessage = new MyMessage( requireActivity() );
mMessage.setClickListener(new MyMessage.ClickListener() {
@Override
public void onClick(Bundle result) {//メッセージボードのボタンがタップされると呼ばれる
if (result.getInt("ID") == 1) {// メッセージボードを開いた処理のID
edit(result.getInt("V_ID"));//ボタンのViewID
}
}
});
// 省略
}
private void edit(int id) {
switch (id) {
case R.id.key_done:
break;
case R.id.key_accepted:
break;
case R.id.key_cancel:
break;
default:
}
}
}
昔にコールバック記事を見たような覚えから簡単とたかを括った。
見つからない分からない…。
そして、下のサイトに辿り着きました。
何となく自分に合わせて組み込み。
動く…。
【nyan のアプリ開発】様 [Android] カスタム Listener を interface を使って実装してみる