Как укоротить программу?
Подскажите как укоротить программу?
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private final TextView[] answer = new TextView[6];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView[] question = new TextView[6];
question[0] = findViewById(R.id.q0);
question[1] = findViewById(R.id.q1);
question[2] = findViewById(R.id.q2);
question[3] = findViewById(R.id.q3);
question[4] = findViewById(R.id.q4);
question[5] = findViewById(R.id.q5);
for (TextView textView : question) {
textView.setOnClickListener(this);
}
answer[0] = findViewById(R.id.a0);
answer[1] = findViewById(R.id.a1);
answer[2] = findViewById(R.id.a2);
answer[3] = findViewById(R.id.a3);
answer[4] = findViewById(R.id.a4);
answer[5] = findViewById(R.id.a5);
for (TextView textView : answer) {
textView.setVisibility(View.GONE);
}
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.q0)
answer[0].setVisibility(answer[0].isShown() ? View.GONE : View.VISIBLE);
else if (view.getId() == R.id.q1)
answer[1].setVisibility(answer[1].isShown() ? View.GONE : View.VISIBLE);
else if (view.getId() == R.id.q2)
answer[2].setVisibility(answer[2].isShown() ? View.GONE : View.VISIBLE);
else if (view.getId() == R.id.q3)
answer[3].setVisibility(answer[3].isShown() ? View.GONE : View.VISIBLE);
else if (view.getId() == R.id.q4)
answer[4].setVisibility(answer[4].isShown() ? View.GONE : View.VISIBLE);
else if (view.getId() == R.id.q5)
answer[5].setVisibility(answer[5].isShown() ? View.GONE : View.VISIBLE);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/q0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:text="00" />
<TextView
android:id="@+id/a0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00000" />
<TextView
android:id="@+id/q1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:text="11" />
<TextView
android:id="@+id/a1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="11111" />
<TextView
android:id="@+id/q2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:text="22" />
<TextView
android:id="@+id/a2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="22222" />
<TextView
android:id="@+id/q3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:text="33"/>
<TextView
android:id="@+id/a3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="33333" />
<TextView
android:id="@+id/q4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:text="44" />
<TextView
android:id="@+id/a4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="44444" />
<TextView
android:id="@+id/q5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:text="55" />
<TextView
android:id="@+id/a5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="55555" />
</LinearLayout>
Ответы (1 шт):
Если я правильно понимаю, вам не нравятся чередования одинаковых команд для каждой View. Чтобы это исправить, можно заключить их id в массивы:
private final Integer[] answersIdArray = new Integer[] {R.id.a0, R.id.a1, R.id.a2, R.id.a3,
R.id.a4, R.id.a5};
private final Integer[] questionsIdArray = new Integer[] {R.id.q0, R.id.q1, R.id.q2, R.id.q3,
R.id.q4, R.id.q5};
Тогда все действия в onCreate расположатся в одном цикле, а массив questions станет не нужен:
for (int i = 0; i < answersIdArray.length; i++) {
findViewById(questionsIdArray[i]).setOnClickListener(this);
answer[i] = findViewById(answersIdArray[i]);
answer[i].setVisibility(View.GONE);
}
В onClick проблема также решается с помощью цикла:
if (Arrays.asList(questionsIdArray).contains(view.getId())) {
for (int i = 0; i < questionsIdArray.length; i++) {
if (view.getId() == questionsIdArray[i]) {
answer[i].setVisibility(answer[i].isShown() ? View.GONE : View.VISIBLE);
break;
}
}
}
Это не так удобно и быстро, поэтому, если вам это важно, для onClick я рекомендую использовать Map. Такое решение слегка удлинит код, но увеличит производительность (особенно если количество view будет больше).
private final Map<Integer, Integer> questionsIndexMap = createQuestionsIndexMap();
private Map<Integer, Integer> createQuestionsIndexMap() {
// Ключи - id, значения - индексы.
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < questionsIdArray.length; i++) map.put(questionsIdArray[i], i);
return map;
}
@Override
public void onClick(View view) {
if (questionsIndexMap.containsKey(view.getId())) {
View answerView = answer[questionsIndexMap.get(view.getId())];
answerView.setVisibility(answerView.isShown() ? View.GONE : View.VISIBLE);
}
}
Итоговый код (самый короткий):
package com.hfad.foralicemagic;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.util.Arrays;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private final TextView[] answer = new TextView[6];
private final Integer[] answersIdArray = new Integer[] {R.id.a0, R.id.a1, R.id.a2, R.id.a3,
R.id.a4, R.id.a5};
private final Integer[] questionsIdArray = new Integer[] {R.id.q0, R.id.q1, R.id.q2, R.id.q3,
R.id.q4, R.id.q5};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i < answersIdArray.length; i++) {
findViewById(questionsIdArray[i]).setOnClickListener(this);
answer[i] = findViewById(answersIdArray[i]);
answer[i].setVisibility(View.GONE);
}
}
@Override
public void onClick(View view) {
if (Arrays.asList(questionsIdArray).contains(view.getId())) {
for (int i = 0; i < questionsIdArray.length; i++) {
if (view.getId() == questionsIdArray[i]) {
answer[i].setVisibility(answer[i].isShown() ? View.GONE : View.VISIBLE);
break;
}
}
}
}
}
Но я согласен с @Михаил, в данном случае лучше всё-таки воспользоваться встроенными инструментами Android.