goo blog サービス終了のお知らせ 

タブレット用プログラムの書き止め

android OS & iPadOS の記録。

Fragment [基礎] MyMessageクラス。リスナー組み込み。

2022-10-08 01:07:10 | Android studio 日記

フラグメント内で使うメッセージボード。
メッセージボードのボタンをタップするとフラグメントに通知を送る。

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 を使って実装してみる