【问题标题】:I need to hide a radio button in a quiz app android我需要在测验应用程序android中隐藏一个单选按钮
【发布时间】:2022-01-05 19:14:00
【问题描述】:

我想就我的 android 代码寻求一些帮助。我正在尝试使用 SQLite 开发一个测验应用程序。可能的答案数量不同,因此如果答案例如,我需要从主屏幕隐藏单选按钮。是 3 而不是 4(默认情况下 4 是单选按钮的数量)。尝试使用:

if (DataContract.QuestionTable.COLUMN_ANSWER4.isEmpty ()){ radioButton4.setVisibility (View.INVISIBLE); }

但似乎不起作用。我是 android 编程新手,这是我的第一个项目,所以每条评论都会很有帮助。谢谢。

【问题讨论】:

  • 我们需要显示错误,您可以在控制台上分享错误吗?
  • 控制台没有错误...只是不起作用...按钮仍然可见,没有文字。
  • 如果我将光标放在代码上,弹出框会显示: Condition 'DataContract.QuestionTable.COLUMN_ANSWER4 == null' 始终为 'false'

标签: java android android-studio radio-button android-sqlite


【解决方案1】:

考虑到随问题发布的代码数量有限,这是一个包含建议技术的演示。

这利用两个表来符合规范化方法。问题表和答案表。每个答案(子项)都有一个与单个问题(父项)的链接/地图/关系/关联。为了防止引用完整性问题,我们使用了外键约束。

首先为 QuestionsAnswersQuestionWithAnswers 提供一些 POJO(即答案)

问题POJO

class QuestionPOJO {
    long questionId;
    String questionText;

    public QuestionPOJO(long questionId, String questionText) {
        this.questionId = questionId;
        this.questionText = questionText;
    }

    public long getQuestionId() {
        return questionId;
    }

    public void setQuestionId(long questionId) {
        this.questionId = questionId;
    }

    public String getQuestionText() {
        return questionText;
    }

    public void setQuestionText(String questionText) {
        this.questionText = questionText;
    }
}

回答POJO

class AnswerPOJO {
    long answerId;
    long questionMap;
    String answerText;
    boolean correct = false;

    public AnswerPOJO(long answerid, long questionMap, String answerText, boolean correct) {
        this.answerId = answerid;
        this.questionMap = questionMap;
        this.answerText = answerText;
        this.correct = correct;
    }

    public long getAnswerId() {
        return answerId;
    }

    public void setAnswerId(long answerId) {
        this.answerId = answerId;
    }

    public long getQuestionMap() {
        return questionMap;
    }

    public void setQuestionMap(long questionMap) {
        this.questionMap = questionMap;
    }

    public boolean isCorrect() {
        return correct;
    }

    public void setCorrect(boolean correct) {
        this.correct = correct;
    }

    public String getAnswerText() {
        return answerText;
    }

    public void setAnswerText(String answerText) {
        this.answerText = answerText;
    }
}

QuestionWithAnswerPOJO

class QuestionWithAnswersPOJO {
    QuestionPOJO question;
    ArrayList<AnswerPOJO> answers = new ArrayList<>();

    public QuestionWithAnswersPOJO(QuestionPOJO question, List<AnswerPOJO> answers) {
        this.question = question;
        this.answers.clear();
        this.answers.addAll(answers);
    }

    public QuestionPOJO getQuestion() {
        return question;
    }

    public void setQuestion(QuestionPOJO question) {
        this.question = question;
    }

    public ArrayList<AnswerPOJO> getAnswers() {
        return answers;
    }

    public void setAnswers(ArrayList<AnswerPOJO> answers) {
        this.answers = answers;
    }
}

现在是处理所有数据库活动的 DatabaseHelper。包括添加和获取问题和答案的方法,尤其是获取属于某个问题的答案。

class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "questions.db";
    public static final int DATABASE_VERSION = 1;

    public static final String QUESTION_TABLE = "question";
    public static final String QUESTION_ID_COLUMN = BaseColumns._ID;
    public static final String QUESTION_TEXT_COLUMN = "question_text";
    public static final String ANSWER_TABLE = "answer";
    public static final String ANSWER_ID_COLUMN = BaseColumns._ID;
    public static final String ANSWER_TEXT_COLUMN = "answer_text";
    public static final String ANSWER_QUESTION_MAP_COLUMN = "question_map";
    public static final String ANSWER_CORRECT_COLUMN = "correct";

    private static volatile DatabaseHelper instance = null;
    private DatabaseHelper(Context context) {
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
    }

    private static SQLiteDatabase db = null;

    public static DatabaseHelper getInstance(Context context, boolean forceOpen) {
        if (instance == null) {
            instance = new DatabaseHelper(context);
        }
        if (forceOpen) {
            db = instance.getWritableDatabase();
        }
        return instance;
    }
    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("CREATE TABLE IF NOT EXISTS " + QUESTION_TABLE + "(" +
                QUESTION_ID_COLUMN + " INTEGER PRIMARY KEY," +
                QUESTION_TEXT_COLUMN + " TEXT" +
                ");");
        db.execSQL("CREATE TABLE IF NOT EXISTS " + ANSWER_TABLE + "(" +
                ANSWER_ID_COLUMN + " INTEGER PRIMARY KEY," +
                ANSWER_TEXT_COLUMN + " TEXT," +
                ANSWER_QUESTION_MAP_COLUMN + " INTEGER REFERENCES " + QUESTION_TABLE + "(" + QUESTION_ID_COLUMN + ") ON DELETE CASCADE ON UPDATE CASCADE," +
                ANSWER_CORRECT_COLUMN + " INTEGER DEFAULT 0 /* false */" +
                ");");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {

    }

    // Fully comprehensive Question insert
    public long insertQuestion(Long questionId, String questionText) {
        init_db_AsWriteableDatabase();
        long rv = -2;
        ContentValues cv = new ContentValues();
        if (questionId != null && questionId > 0) {
            cv.put(QUESTION_ID_COLUMN,questionId);
        }
        if (questionText != null && questionText.length() > 0) {
            cv.put(QUESTION_TEXT_COLUMN,questionText);
        }
        if (cv.size() > 0) {
            rv = db.insert(QUESTION_TABLE,null,cv);
        }
        return rv;
    }

    // Concise Question insert
    public long insertQuestion(String questionText) {
        return insertQuestion(null,questionText);
    }

    // Fully comprehensive Answer insert
    public long insertAnswer(Long answerId, long questionMap, String answerText, boolean correct) {
        init_db_AsWriteableDatabase();
        long rv = -2;
        ContentValues cv = new ContentValues();
        if (answerId != null && answerId > 0) {
            cv.put(ANSWER_ID_COLUMN,answerId);
        }
        if (answerText != null && answerText.length() > 0) {
            cv.put(ANSWER_CORRECT_COLUMN,correct);
            cv.put(ANSWER_TEXT_COLUMN,answerText);
            cv.put(ANSWER_QUESTION_MAP_COLUMN,questionMap);
            rv = db.insert(ANSWER_TABLE,null,cv);
        }
        return rv;
    }

    // long concise Answer insert
    public long insertAnswer(long questionMap, String answerText, boolean correct) {
        return insertAnswer(null,questionMap,answerText,correct);
    }
    public long insertAnswer(long questionMap, String answerText) {
        return insertAnswer(questionMap,answerText,false);
    }
    // short concise Answer insert
    private void init_db_AsWriteableDatabase() {
        if (db == null) {
            db = this.getWritableDatabase();
        }
    }


    @SuppressLint("Range")
    public QuestionPOJO getQuestionById(long questionId) {
        QuestionPOJO rv = null;
        init_db_AsWriteableDatabase();
        Cursor csr = db.query(QUESTION_TABLE,null,QUESTION_ID_COLUMN+"=?",new String[]{String.valueOf(questionId)},null,null,null);
        if (csr.moveToNext()) {
            rv = new QuestionPOJO(csr.getLong(csr.getColumnIndex(QUESTION_ID_COLUMN)),csr.getString(csr.getColumnIndex(QUESTION_TEXT_COLUMN)));
        }
        csr.close();
        return rv;
    }

    @SuppressLint("Range")
    public List<AnswerPOJO> getAnswersForQuestion(long questionId, boolean onlyCorrect) {
        init_db_AsWriteableDatabase();
        ArrayList<AnswerPOJO> rv = new ArrayList<>();
        StringBuilder whereClause = new StringBuilder();
        whereClause.append(ANSWER_QUESTION_MAP_COLUMN + "=?");
        if (onlyCorrect) {
            whereClause.append(" AND ").append(ANSWER_CORRECT_COLUMN);
        }
        Cursor csr = db.query(ANSWER_TABLE,null,whereClause.toString(),new String[]{String.valueOf(questionId)},null,null,null);
        while (csr.moveToNext()) {
            rv.add(
                new AnswerPOJO(
                        csr.getLong(csr.getColumnIndex(ANSWER_ID_COLUMN)),
                        questionId,
                        csr.getString(csr.getColumnIndex(ANSWER_TEXT_COLUMN)),
                        csr.getInt(csr.getColumnIndex(ANSWER_CORRECT_COLUMN)) > 0
                )
            );
        }
        csr.close();
        return rv;
    }
}

最后将所有内容和具有 4 个单选按钮布局的活动以及作为 TextView 的相关答案放在一起。

所以布局是:-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!">
    </TextView>

    <RadioGroup
        android:id="@+id/question_radiogroup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <RadioButton
            android:id="@+id/answer1_radioButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:ignore="DuplicateSpeakableTextCheck"></RadioButton>
        <TextView
            android:id="@+id/answer1_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </TextView>
        <RadioButton
            android:id="@+id/answer2_radioButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </RadioButton>
        <TextView
            android:id="@+id/answer2_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </TextView>
        <RadioButton
            android:id="@+id/answer3_radioButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </RadioButton>
        <TextView
            android:id="@+id/answer3_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </TextView>

        <RadioButton
            android:id="@+id/answer4_radioButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </RadioButton>
        <TextView
            android:id="@+id/answer4_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </TextView>
    </RadioGroup>

</LinearLayout>
  • 简单到足以显示如何根据答案数量隐藏按钮(或根据按钮/文本视图数量限制)

以及要演示的活动:-

public class MainActivity extends AppCompatActivity {
    DatabaseHelper dbHelper;
    RadioButton[] radiobuttons = new RadioButton[4];
    TextView[] answerTexts = new TextView[4];
    QuestionWithAnswersPOJO currentQuestionWithAnswers;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /*
            prepare Radion Buttons and associated TextViews
         */
        radiobuttons[0] = this.findViewById(R.id.answer1_radioButton);
        radiobuttons[1] = this.findViewById(R.id.answer2_radioButton);
        radiobuttons[2] = this.findViewById(R.id.answer3_radioButton);
        radiobuttons[3] = this.findViewById(R.id.answer4_radioButton);
        answerTexts[0] = this.findViewById(R.id.answer1_textview);
        answerTexts[1] = this.findViewById(R.id.answer2_textview);
        answerTexts[2] = this.findViewById(R.id.answer3_textview);
        answerTexts[3] = this.findViewById(R.id.answer4_textview);

        /*
            Prepare to use Database
         */
        dbHelper = DatabaseHelper.getInstance(this,true);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        /* Clear any existing data for consistent results */
        db.delete(DatabaseHelper.ANSWER_TABLE,null,null);
        db.delete(DatabaseHelper.QUESTION_TABLE,null,null);
        /* Add some demo data  1 question with 5 answers (comment out to reduce number of answers)*/
        long q1id = dbHelper.insertQuestion("What is 1 + 1");
        dbHelper.insertAnswer(q1id,"It is 1");
        dbHelper.insertAnswer(q1id,"it is 2", true);
        dbHelper.insertAnswer(q1id,"It is 3");
        dbHelper.insertAnswer(q1id,"It is 4");
        dbHelper.insertAnswer(q1id,"It is something Else"); // will be ignored because only 4 radio buttons

        /* Get the question with the answers, however many ot has */
        currentQuestionWithAnswers = new QuestionWithAnswersPOJO(dbHelper.getQuestionById(q1id),dbHelper.getAnswersForQuestion(q1id,false));
        /* setup (refresh) the radio buttons and textviews */
        getAndSetRadioButtons(currentQuestionWithAnswers);
    }

    /*
        Does as it says
     */
    private void getAndSetRadioButtons(QuestionWithAnswersPOJO qwa) {
        // Clear All

        for (int i=0;i < radiobuttons.length; i++) {
            radiobuttons[i].setVisibility(View.GONE);
            answerTexts[i].setText("");
            answerTexts[i].setVisibility(View.GONE);
        }
        /* show only the least of answers/radio buttons */
        int numberToShow = radiobuttons.length;
        if (qwa.answers.size() < radiobuttons.length) {
            numberToShow = qwa.answers.size();
        }
        int i = 0;
        for(AnswerPOJO a: qwa.answers) {
            if (i < numberToShow) {
                radiobuttons[i].setVisibility(View.VISIBLE);
                answerTexts[i].setVisibility(View.VISIBLE);
                answerTexts[i++].setText(a.answerText);
            } else {
                /* nothing more to do so early break out of the loop */
                break;
            }
        }
    }
}

结果

结果 1 - 运行 5 个答案(参见 cmets re 5th answer)

结果 2 - 所有栏 1 个答案注释掉,所以问题只有 1 个答案

使用的代码:-

    long q1id = dbHelper.insertQuestion("What is 1 + 1");
    dbHelper.insertAnswer(q1id,"It is 1");
    //dbHelper.insertAnswer(q1id,"it is 2", true);
    //dbHelper.insertAnswer(q1id,"It is 3");
    //dbHelper.insertAnswer(q1id,"It is 4");
    //dbHelper.insertAnswer(q1id,"It is something Else"); // will be ignored because only 4 radio buttons

显示:-

结果 3 - 仅插入第一个和第 5 个答案

等等。


代码发布后的附加内容。

现在已添加附加答案作为代码。

你说:-

尝试使用: if (DataContract.QuestionTable.COLUMN_ANSWER4.isEmpty ()){ radioButton4.setVisibility (View.INVISIBLE); } 但似乎不起作用。

如果 DataContract.QuestionTable.COLUMN_ANSWER4 为空,则将面临更严重的问题,因为它是 列名

您应该检查已从 DB 检索并放入 currentQuestion 的列的内容,以查找正在检查的问题。

我相信使用(旧代码注释掉):-

        radioButton1.setText(currentQuestion.getAnswer1 ());
        radioButton2.setText(currentQuestion.getAnswer2 ());
        radioButton3.setText(currentQuestion.getAnswer3 ());
        radioButton4.setText(currentQuestion.getAnswer4 ());
        if(currentQuestion.getAnswer4() == null || currentQuestion.getAnswer4().isEmpty()) {
            radioButton4.setVisibility(View.INVISIBLE);
        } else {
            radioButton4.setVisibility(View.VISIBLE); // just in case it is INVISIBLE
            radioButton4.setText(currentQuestion.getAnswer4());
        }
        /*
        if (DataContract.QuestionTable.COLUMN_ANSWER4.isEmpty ()){
            radioButton4.setVisibility (View.INVISIBLE);
        } else {
            radioButton4.setText(currentQuestion.getAnswer4 ());
        }
         */

将解决此问题。例如在第三季度:-

【讨论】:

  • 亲爱的 Mike,非常感谢您的精彩回答,即使我的代码在结构上略有不同。我将发布我的代码,以便人们更容易回答。这是我在 Stackoverflow 上的第一篇文章,所以我对我需要的东西并不那么具体!不过还是谢谢你!!你太棒了,我会试着把你的建议放在我的代码中。最好的问候!!
  • @fotonio 重新检查答案
  • 非常感谢 Mike 的有用指正。效果很好!!
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2018-10-20
  • 2015-01-03
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多