Android сокращение кода
У меня есть код в котором на кнопку назначен setOnTouchListener и setOnClickListener из-за реализации данного написания он занимает очень большую часть. Можно ли его как-то сократить, к примеру, можно ли его засунуть в Adapter, а потом в основном файле просто ссылаться на этот Adapter? Или может как-то по другому можно?
private boolean firstPlayed_tasks = false;
private View prapor_tasks_liner_parent;
private View prapor_description_liner_parent;
private Animation anim1;
private Animation anim2;
private ImageView prapor_description_img;
private ImageView prapor_tasks_img;
private TextView prapor_tasks_txv;
private TextView prapor_description_txv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_menu_list_traders_prapor, container, false);
}
@SuppressLint({"ResourceAsColor", "ClickableViewAccessibility"})
@Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
final int textColor1 = ContextCompat.getColor(Objects.requireNonNull(this.getContext()), R.color.color_0);
final int textColor2 = ContextCompat.getColor(Objects.requireNonNull(this.getContext()), R.color.color_2);
ImageButton back = requireView().findViewById(R.id.back);
back.setOnClickListener(v -> Navigation.findNavController(view)
.navigate(R.id.action_fragment_Menu_list_Traders_Prapor_to_fragment_Menu_list_Traders));
prapor_description_liner_parent = requireView().findViewById(R.id.prapor_description_liner_parent);
prapor_description_txv = requireView().findViewById(R.id.prapor_description_txv);
prapor_tasks_liner_parent = requireView().findViewById(R.id.prapor_tasks_liner_parent);
prapor_tasks_img = requireView().findViewById(R.id.prapor_tasks_img);
prapor_tasks_txv = requireView().findViewById(R.id.prapor_tasks_txv);
anim1 = AnimationUtils.loadAnimation(getContext(), R.anim.rotate_1);
anim1.setFillAfter(true);
anim2 = AnimationUtils.loadAnimation(getContext(), R.anim.rotate_2);
anim2.setFillAfter(true);
prapor_tasks_txv.setOnTouchListener((view1, motionEvent) -> {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
break;
case MotionEvent.ACTION_MOVE: // движение
case MotionEvent.ACTION_CANCEL:
prapor_tasks_txv.setTextColor(textColor1);
prapor_tasks_img.setColorFilter(textColor1);
break;
}
return false;
});
prapor_tasks_img.setOnTouchListener((view1, motionEvent) -> {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
break;
case MotionEvent.ACTION_MOVE: // движение
case MotionEvent.ACTION_CANCEL:
prapor_tasks_txv.setTextColor(textColor1);
prapor_tasks_img.setColorFilter(textColor1);
break;
}
return false;
});
/////////////////////////////////////////
prapor_tasks_txv.setOnClickListener(v -> {
if (!firstPlayed_tasks) {
prapor_tasks_liner_parent.setVisibility(View.VISIBLE);
prapor_tasks_img.startAnimation(anim1);
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
firstPlayed_tasks = true;
prapor_tasks_txv.setOnTouchListener((view1, motionEvent) -> {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
case MotionEvent.ACTION_MOVE: // движение
case MotionEvent.ACTION_CANCEL:
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
break;
}
return false;
});
prapor_tasks_img.setOnTouchListener((view1, motionEvent) -> {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
case MotionEvent.ACTION_MOVE: // движение
case MotionEvent.ACTION_CANCEL:
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
break;
}
return false;
});
// играем первую анимацию
} else {
prapor_tasks_liner_parent.setVisibility(View.GONE);
prapor_tasks_img.startAnimation(anim2);
prapor_tasks_txv.setTextColor(textColor1);
prapor_tasks_img.setColorFilter(textColor1);
firstPlayed_tasks = false;
prapor_tasks_txv.setOnTouchListener((view1, motionEvent) -> {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
break;
case MotionEvent.ACTION_MOVE: // движение
case MotionEvent.ACTION_CANCEL:
prapor_tasks_txv.setTextColor(textColor1);
prapor_tasks_img.setColorFilter(textColor1);
break;
}
return false;
});
prapor_tasks_img.setOnTouchListener((view1, motionEvent) -> {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
break;
case MotionEvent.ACTION_MOVE: // движение
case MotionEvent.ACTION_CANCEL:
prapor_tasks_txv.setTextColor(textColor1);
prapor_tasks_img.setColorFilter(textColor1);
break;
}
return false;
});
// играем вторую анимацию
}
});
prapor_tasks_img.setOnClickListener(v -> {
if (!firstPlayed_tasks) {
prapor_tasks_liner_parent.setVisibility(View.VISIBLE);
prapor_tasks_img.startAnimation(anim1);
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
firstPlayed_tasks = true;
prapor_tasks_txv.setOnTouchListener((view1, motionEvent) -> {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
case MotionEvent.ACTION_MOVE: // движение
case MotionEvent.ACTION_CANCEL:
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
break;
}
return false;
});
prapor_tasks_img.setOnTouchListener((view1, motionEvent) -> {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
case MotionEvent.ACTION_MOVE: // движение
case MotionEvent.ACTION_CANCEL:
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
break;
}
return false;
});
// играем первую анимацию
} else {
prapor_tasks_liner_parent.setVisibility(View.GONE);
prapor_tasks_img.startAnimation(anim2);
prapor_tasks_txv.setTextColor(textColor1);
prapor_tasks_img.setColorFilter(textColor1);
firstPlayed_tasks = false;
prapor_tasks_txv.setOnTouchListener((view1, motionEvent) -> {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
break;
case MotionEvent.ACTION_MOVE: // движение
case MotionEvent.ACTION_CANCEL:
prapor_tasks_txv.setTextColor(textColor1);
prapor_tasks_img.setColorFilter(textColor1);
break;
}
return false;
});
prapor_tasks_img.setOnTouchListener((view1, motionEvent) -> {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
prapor_tasks_txv.setTextColor(textColor2);
prapor_tasks_img.setColorFilter(textColor2);
break;
case MotionEvent.ACTION_MOVE: // движение
case MotionEvent.ACTION_CANCEL:
prapor_tasks_txv.setTextColor(textColor1);
prapor_tasks_img.setColorFilter(textColor1);
break;
}
return false;
});
// играем вторую анимацию
}
});
}
}
~~~~~~~~~~~~~~~~~
Ответы (2 шт):
Используя лямбда выражения вы создаете анонимный класс прямо в месте где его необходимо использовать (если я нигде не ошибаюсь). Если вы создадите свою реализацию листенера в другом файле и унаследуете его от onClickListener(точно не помню как называется родительский класс листенера, надеюсь IDE подскажет) то в setOnClickListener можно добавить ваш собственный листенер.
Можете создать свой класс вроде такого:
class PraporTaskListener implements View.OnClickListener {
private NavController navController;
PraporTaskListener (NavController navController) {
this.navController = navController;
}
@Override
public void onClick(View view) {
// Здесь обрабатываете ваш клик
navController.navigate(R.id.action_fragment_Menu_list_Traders_Prapor_to_fragment_Menu_list_Traders));
}
}
Тогда в активити
back.setOnClickListener(new PraporTaskListener(Navigation.findNavController(view)))
Собственно так же и с другими листенерами.
Но если эти самые листенеры используются только в одном месте то подобный подход не очень практичен. Лучше вынести каждый листенер просто а отдельный метод. И тогда
back.setOnClickListener((View v) -> { onClickBack() });
private void onClickBack() {
// do something
}