警告などを表示してボタンを押して閉じる。状況によって複数のボタンを表示して選択もさせる。
単純な内容なのでアラが目立つ。他の操作を遮断するのにonTouch()、onClick() を( Layout.getVisibility() == View.VISIBLE ) でスルー判断させなければならない。
とりあえず、何ができて、どんな問題が起こるのかを知るための基礎。
メッセージボードのデザインをする。
@id/message_layout を setVisibility( View.GONE )、setVisibility( View.VISIBLE )すれば、非表示、表示を切り替えられる。そして、ボタンの代わりとなる TextView も setVisibility() で必要に応じて使う選択肢の数を変えられる。用意したボタンは3個、メソッドの引数でボタン1個表示、2個表示を切り替えている。ボタン上の文字も変更できる。
【activity_main.xml】
< ?xml version="1.0" encoding="utf-8"?>
< ConstraintLayout
略
< ConstraintLayout
android:id="@+id/message_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FFFFFF"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" >
< TextView
android:id="@+id/message_text"
android:layout_width="400dp"
android:layout_height="wrap_content"
android:maxLines="6"
android:textSize="24sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
< LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintStart_toStartOf="@id/message_text"
app:layout_constraintEnd_toEndOf="@id/message_text"
app:layout_constraintTop_toBottomOf="@id/message_text" >
< TextView
android:id="@+id/key_done"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="done" />
< TextView
android:id="@+id/key_accepted"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="accepted" />
< TextView
android:id="@+id/key_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="cancel" />
</ LinearLayout>
</ ConstraintLayout>
</ ConstraintLayout>
骨子。色々と肉付けが必要。また、onClick()処理は、複数のメッセージに対応させるため、分岐処理を組み込む。
【MainActivity.java】
略
private ConstraintLayout mMessageLayout;
private TextView mMessageTextView, mAcceptedTextView, mCancelTextView, mDoneTextView;
private final View.OnClickListener mMessageClick;
略
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
略
mMessageClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.key_done:
mMessageLayout.setVisibility( View.GONE );
break;
case R.id.key_accepted:
break;
case R.id.key_cancel:
break;
}
}
};
mMessageLayout = (ConstraintLayout)findViewById( R.id.message_layout );
mMessageTextView = (TextView) findViewById( R.id.message_text ); // メッセージ
mAcceptedTextView = (TextView) findViewById( R.id.key_accepted ); // ボタン 1
mCancelTextView = (TextView) findViewById( R.id.key_cancel ); // ボタン 2
mDoneTextView = (TextView) findViewById( R.id.key_done ); // ボタン 3
mAcceptedTextView.setOnClickListener( mMessageClick );
mCancelTextView.setOnClickListener( mMessageClick );
mDoneTextView.setOnClickListener( mMessageClick );
略
}
public void onMessageBoard() { mMessageLayout.setVisibility( View.VISIBLE ); }
public void offMessageBoard() { mMessageLayout.setVisibility( View.GONE ); }
public boolean isMessageBoard() { return ( mMessageLayout.getVisibility() == View.VISIBLE ); }
public void myMessage( String text ) { // メッセージのみは、ボタン1個表示。
mDoneTextView.setVisibility( View.VISIBLE );
mAcceptedTextView.setVisibility( View.GONE );
mCancelTextView.setVisibility( View.GONE );
mDoneTextView.setText( "done" );
mMessageTextView.setText( text );
mMessageLayout.setVisibility( View.VISIBLE );
}
public void myMessage( String text, String accepted, String cancel ) {
mDoneTextView.setVisibility( View.GONE );
mAcceptedTextView.setVisibility( View.VISIBLE );
mCancelTextView.setVisibility( View.VISIBLE );
mMessageTextView.setText( text ); // メッセージ
mAcceptedTextView.setText( accepted ); // ボタンの文字設定
mCancelTextView.setText( cancel ); // ボタンの文字設定
mMessageLayout.setVisibility( View.VISIBLE );
}
引数の型が違う、数が違うで処理内容を判断する。
ボタンの数が同じで処理が異なる場合は、モード、IDを加えて分岐処理をさせる。
isMessageBoard()の戻り値が true ならメッセージが開いているので、他のタッチイベント、オンクリック処理はスルーさせる。
骨子なので肉付けしないと動かない?。実物は服も着せてるので問題ない状態。