ともちゃんのアプリ開発日記

組込みC言語プログラマだったともちゃんが、四苦八苦しながら、AndroidのJAVA/Kotlin、iOSのSwiftUIを習得して行きます。ともちゃんの備忘録も兼ねています。

ボタンの背景色の変更

ボタンの背景色の変更は、単純に

Button button = findViewByID(R.id.button1);

button.setBackgroundColor(Color);

でできます。

例えば私の実装は下記です。

まず、色の定義クラスを作ります。

public class DataCenter {
public final String COLOR_SKYBLUE_TOOLBAR = "#FF1E90FF";
public final String COLOR_SKYBLUE_VIEW = "#FFB4FFFF";
public final String COLOR_SKYBLUE_BUTTON_NORMAL = "#FF00C8C8";
public final String COLOR_SKYBLUE_BUTTON_CLICK = "#FF009898";


public final String COLOR_GREEN_TOOLBAR = "#FF228B22";
public final String COLOR_GREEN_VIEW = "#FF7FFFD4";
public final String COLOR_GREEN_BUTTON_NORMAL = "#FF00B050";
public final String COLOR_GREEN_BUTTON_CLICK = "#FF009030";


public final String COLOR_YELLOW_TOOLBAR = "#FFDAA520";
public final String COLOR_YELLOW_VIEW = "#FFFFFF96";
public final String COLOR_YELLOW_BUTTON_NORMAL = "#FFC8C800";
public final String COLOR_YELLOW_BUTTON_CLICK = "#FF989800";

public final String COLOR_WHITE_TOOLBAR = "#FF3F51B5";
public final String COLOR_WHITE_BUTTON_CLICK = "#FFB0B0B0";

public void DataCenter () {};

}

 

 次いで、色の設定本体

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_data_main, container, false);

DataCenter dataCenter = new DataCenter();

Button btnRegister = (Button) view.findViewById(R.id.buttonDataMainRegister);
// 「登録」のOnClickListenerを設定
btnRegister.setOnClickListener(new registerOnClickListener());

SharedPreferences prefs = getActivity().getSharedPreferences("setting",
Context.MODE_PRIVATE);
int backgroundColor = prefs.getInt("BackgroundColor", 0);
switch (backgroundColor) {
case R.id.radioButtonSkyBule :
btnRegister.setBackgroundColor(
Color.parseColor(dataCenter.COLOR_SKYBLUE_BUTTON_NORMAL));
break;
}
return view;
}

 これでボタンの背景色を変更できました。

ここで問題となるのが、ボタンの背景色を変えると、ボタンをタッチしたときの反応まで無くなってしまうということです。

仕方ないので、独自で実装しました。

ボタンをタッチ・クリックしたときは

①OnToucheイベント(MotionEvent.ACTION_DOWN)

②OnLongClick イベント

OnToucheイベント(MotionEvent.ACTION_UP)

④OnClickイベント

がこの順番で発生します。ロングクリックしないときは、OnLongClick イベントは発生しません。

この①と③を拾ってボタンの背景色を変えてボタンの反応を復活させることにしました。

OnCreateView()に、以下のように、setOnTouchListener()を追加します。

Button btnRegister = (Button) view.findViewById(R.id.buttonDataMainRegister);
// 「登録」のOnClickListenerを設定
btnRegister.setOnClickListener(new registerOnClickListener());
// 「登録」のOnTouchListenerを設定
btnRegister.setOnTouchListener(new registerOnTouchListener());

OnTouchListener本体です

// 「登録」のOnTouchListener本体
private class registerOnTouchListener implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {

Button button = (Button) getActivity().
findViewById(R.id.buttonDataMainRegister);

DataCenter dataCenter = new DataCenter();
SharedPreferences prefs = getActivity().getSharedPreferences("setting",
Context.MODE_PRIVATE);
int backgroundColor = prefs.getInt("BackgroundColor", 0);
int touchEvent = event.getAction();
switch (backgroundColor) {
case R.id.radioButtonSkyBule :
switch (touchEvent) {
case MotionEvent.ACTION_DOWN :
button.setBackgroundColor(
Color.parseColor(dataCenter.COLOR_SKYBLUE_BUTTON_CLICK));
break;
case MotionEvent.ACTION_UP:
button.setBackgroundColor(
Color.parseColor(dataCenter.COLOR_SKYBLUE_BUTTON_NORMAL));
break;
}
break;
case R.id.radioButtonGreen :
switch (touchEvent) {
case MotionEvent.ACTION_DOWN :
button.setBackgroundColor(
Color.parseColor(dataCenter.COLOR_GREEN_BUTTON_CLICK));
break;
case MotionEvent.ACTION_UP:
button.setBackgroundColor(
Color.parseColor(dataCenter.COLOR_GREEN_BUTTON_NORMAL));
break;
}
break;
case R.id.radioButtonYellow :
switch (touchEvent) {
case MotionEvent.ACTION_DOWN :
button.setBackgroundColor(
Color.parseColor(dataCenter.COLOR_YELLOW_BUTTON_CLICK));
break;
case MotionEvent.ACTION_UP:
button.setBackgroundColor(
Color.parseColor(dataCenter.COLOR_YELLOW_BUTTON_NORMAL));
break;
}
break;
default :
switch (touchEvent) {
case MotionEvent.ACTION_DOWN :
button.setBackgroundColor(
Color.parseColor(dataCenter.COLOR_WHITE_BUTTON_CLICK));
break;
case MotionEvent.ACTION_UP:
button.setBackgroundColor(Color.LTGRAY);
break;
}
break;
}
return false;
}
}

 

 これで、ボタンをクリックしたときの反応が復活します。