RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1431308
Accepted
Alice Magic
Alice Magic
Asked:2022-07-20 04:28:51 +0000 UTC2022-07-20 04:28:51 +0000 UTC 2022-07-20 04:28:51 +0000 UTC

如何缩短程序?

  • 772

告诉我如何缩短程序?

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>
android java
  • 1 1 个回答
  • 61 Views

1 个回答

  • Voted
  1. Best Answer
    Vestalt
    2022-07-20T14:50:37Z2022-07-20T14:50:37Z

    如果我理解正确,您不喜欢为每个视图交替使用相同的命令。要解决此问题,您可以将其 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;
            }
        }
    }
    

    它不是那么方便和快捷,所以如果它对你很重要,我建议使用 Map for onClick。这个决定会稍微加长代码,但会提高性能(尤其是在视图数量较大的情况下)。

    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;
                    }
                }
            }
        }
    }
    

    但我同意@Mikhail,在这种情况下,最好使用内置的 Android 工具。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5