繁体   English   中英

如何通过按下按钮重置 MDC 微调器(AutoCompleteTextview/ExposedDropdownMenu)中的选定项目

[英]How to reset selected item in MDC spinner (AutoCompleteTextview/ ExposedDropdownMenu) with press of a button

我正在开发一个简单的棒球计分应用程序,用户可以从两个 Material Design Components 下拉菜单中选择对立的球队。 用户通过按下相应团队列上的按钮来跟踪分数。 有一个重置按钮可以将所有分数重置为“0”。 我已经弄清楚了这部分。 我需要帮助的是,我希望这个重置按钮也能将微调器重置回显示提示的默认值。 我不太清楚它是如何与常规微调器一起工作的,但谷歌已经放弃了微调器,转而使用 Material Design 中 TextInputLayout 内的 AutoCompleteTextview。 我遇到了 clearListSelection(),但不完全确定我是否正确实施了它。 任何帮助将不胜感激。

更好的应用视觉效果

MainActivity.java


import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatAutoCompleteTextView;

import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.TextView;

import com.google.android.material.internal.Experimental;

public class MainActivity extends AppCompatActivity {

    private static final String[] TEAMS_A = new String[]{
            "Arizona Diamondbacks",
            "Atlanta Braves",
            "Baltimore Orioles",
            "Boston Red Sox",
            "Chicago Cubs",
            "Chicago White Sox",
            "Cincinnati Reds",
            "Cleveland Indians",
            "Colorado Rockies",
            "Detroit Tigers",
            "Miami Marins",
            "Houston Astros",
            "Kansas City Royals",
            "Los Angeles Angels",
            "Los Angeles Dodgers",
            "Milwaukee Brewers",
            "Minnesota Twins",
            "New York Mets",
            "New York Yankess",
            "Oakland Athletics",
            "Philadelphia Phillies",
            "Pittsburgh Pirates",
            "St. Louis Cardinals",
            "San Diego Padres",
            "San Francisco Giants",
            "Seattle Mariners",
            "Tampa Bay Rays",
            "Texas Rangers",
            "Toronto Blue Jays",
            "Washington Nationals"
    };

    private static final String[] TEAMS_B = new String[]{
            "Arizona Diamondbacks",
            "Atlanta Braves",
            "Baltimore Orioles",
            "Boston Red Sox",
            "Chicago Cubs",
            "Chicago White Sox",
            "Cincinnati Reds",
            "Cleveland Indians",
            "Colorado Rockies",
            "Detroit Tigers",
            "Miami Marins",
            "Houston Astros",
            "Kansas City Royals",
            "Los Angeles Angels",
            "Los Angeles Dodgers",
            "Milwaukee Brewers",
            "Minnesota Twins",
            "New York Mets",
            "New York Yankess",
            "Oakland Athletics",
            "Philadelphia Phillies",
            "Pittsburgh Pirates",
            "St. Louis Cardinals",
            "San Diego Padres",
            "San Francisco Giants",
            "Seattle Mariners",
            "Tampa Bay Rays",
            "Texas Rangers",
            "Toronto Blue Jays",
            "Washington Nationals"
    };

    int scoreTeamA = 0;

    int scoreTeamB = 0;

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

        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.dropdown_menu_popup_item, TEAMS_A);
        final AutoCompleteTextView filledExposedDropdown = findViewById(R.id.filled_exposed_dropdown_team_a);
        filledExposedDropdown.setAdapter(adapter);


        ArrayAdapter<String> adapter2 = new ArrayAdapter<>(this, R.layout.dropdown_menu_popup_item, TEAMS_B);
        final AutoCompleteTextView filledExposedDropdown2 = findViewById(R.id.filled_exposed_dropdown_team_b);
        filledExposedDropdown2.setAdapter(adapter2);

        displayForTeamA(0);
        displayForTeamB(0);
    }

    /**
     * Increase the score for Team A by 4 points.
     */
    public void addFourForTeamA(View v) {
        scoreTeamA = scoreTeamA + 4;
        displayForTeamA(scoreTeamA);
    }

    /**
     * Increase the score for Team A by 3 points.
     */
    public void addThreeForTeamA(View v) {
        scoreTeamA = scoreTeamA + 3;
        displayForTeamA(scoreTeamA);
    }

    /**
     * Increase the score for Team A by 2 points.
     */
    public void addTwoForTeamA(View v) {
        scoreTeamA = scoreTeamA + 2;
        displayForTeamA(scoreTeamA);
    }

    /**
     * Increase the score for Team A by 1 point.
     */
    public void addOneForTeamA(View v) {
        scoreTeamA = scoreTeamA + 1;
        displayForTeamA(scoreTeamA);
    }

    /**
     * Increase the score for Team B by 4 points.
     */
    public void addFourForTeamB(View v) {
        scoreTeamB = scoreTeamB + 4;
        displayForTeamB(scoreTeamB);
    }

    /**
     * Increase the score for Team B by 3 points.
     */
    public void addThreeForTeamB(View v) {
        scoreTeamB = scoreTeamB + 3;
        displayForTeamB(scoreTeamB);
    }

    /**
     * Increase the score for Team B by 2 points.
     */
    public void addTwoForTeamB(View v) {
        scoreTeamB = scoreTeamB + 2;
        displayForTeamB(scoreTeamB);
    }

    /**
     * Increase the score for Team B by 1 point.
     */
    public void addOneForTeamB(View v) {
        scoreTeamB = scoreTeamB + 1;
        displayForTeamB(scoreTeamB);
    }

    /**
     * Resets the score for both teams back to 0.
     */
    public void resetScore(View v) {
        scoreTeamA = 0;
        scoreTeamB = 0;
        displayForTeamA(scoreTeamA);
        displayForTeamB(scoreTeamB);
        clearListSelection();
    }

    /**
     * Displays the given score for Team A.
     */
    public void displayForTeamA(int score) {
        TextView scoreView = (TextView) findViewById(R.id.team_a_score);
        scoreView.setText(String.valueOf(score));
    }

    /**
     * Displays the given score for Team B.
     */
    public void displayForTeamB(int score) {
        TextView scoreView = (TextView) findViewById(R.id.team_b_score);
        scoreView.setText(String.valueOf(score));
    }


    public void clearListSelection() {
        AutoCompleteTextView filledExposedDropdown = findViewById(R.id.filled_exposed_dropdown_team_a);
        filledExposedDropdown.clearListSelection();
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:override="true">

    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/yankees_3_new" />

    <LinearLayout
        android:id="@+id/score_columns"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="56dp"
        android:layout_marginBottom="16dp"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/team_a_column"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="32dp"
                android:fontFamily="sans-serif-medium"
                android:gravity="center_horizontal"
                android:padding="16dp"
                android:text="@string/team_a"
                android:textColor="@android:color/white"
                android:textSize="24sp" />

            <com.google.android.material.textfield.TextInputLayout
                style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu"
                android:id="@+id/textinputlayout_teamA"
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:textColorHint="@color/text_color">

                <AutoCompleteTextView
                    android:id="@+id/filled_exposed_dropdown_team_a"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:editable="false"
                    android:ellipsize="end"
                    android:singleLine="true"
                    android:textColor="@android:color/white" />
            </com.google.android.material.textfield.TextInputLayout>

            <TextView
                android:id="@+id/team_a_score"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="24dp"
                android:fontFamily="sans-serif-medium"
                android:gravity="center_horizontal"
                android:textColor="@android:color/white"
                android:textSize="56sp"
                tools:text="0" />

            <com.google.android.material.button.MaterialButton
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginBottom="8dp"
                android:onClick="addFourForTeamA"
                android:text="@string/four_runs" />

            <com.google.android.material.button.MaterialButton
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginBottom="8dp"
                android:onClick="addThreeForTeamA"
                android:text="@string/three_runs" />

            <com.google.android.material.button.MaterialButton
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginBottom="8dp"
                android:onClick="addTwoForTeamA"
                android:text="@string/two_runs" />

            <com.google.android.material.button.MaterialButton
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginBottom="40dp"
                android:onClick="addOneForTeamA"
                android:text="@string/one_run" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:background="@android:color/white" />

        <LinearLayout
            android:id="@+id/team_b_column"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="32dp"
                android:fontFamily="sans-serif-medium"
                android:gravity="center_horizontal"
                android:padding="16dp"
                android:text="@string/team_b"
                android:textColor="@android:color/white"
                android:textSize="24sp" />

            <com.google.android.material.textfield.TextInputLayout
                style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu"
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:hint="@string/team_b"
                android:textColorHint="@color/text_color">

                <AutoCompleteTextView
                    android:id="@+id/filled_exposed_dropdown_team_b"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:editable="false"
                    android:ellipsize="end"
                    android:singleLine="true"
                    android:textColor="@android:color/white" />
            </com.google.android.material.textfield.TextInputLayout>

            <TextView
                android:id="@+id/team_b_score"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="24dp"
                android:fontFamily="sans-serif-medium"
                android:gravity="center_horizontal"
                android:textColor="@android:color/white"
                android:textSize="56sp"
                tools:text="0" />

            <com.google.android.material.button.MaterialButton
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginBottom="8dp"
                android:onClick="addFourForTeamB"
                android:text="@string/four_runs" />

            <com.google.android.material.button.MaterialButton
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginBottom="8dp"
                android:onClick="addThreeForTeamB"
                android:text="@string/three_runs" />

            <com.google.android.material.button.MaterialButton
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginBottom="8dp"
                android:onClick="addTwoForTeamB"
                android:text="@string/two_runs" />

            <com.google.android.material.button.MaterialButton
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"

                android:layout_marginBottom="40dp"
                android:onClick="addOneForTeamB"
                android:text="@string/one_run" />
        </LinearLayout>

    </LinearLayout>

    <com.google.android.material.button.MaterialButton
        android:id="@+id/reset_button"
        android:layout_width="128dp"
        android:layout_height="wrap_content"
        android:layout_below="@id/score_columns"
        android:layout_centerHorizontal="true"
        android:onClick="resetScore"
        android:text="@string/reset_button" />

    <com.google.android.material.button.MaterialButton
        android:id="@+id/reset_button_teamA"
        android:layout_width="128dp"
        android:layout_height="wrap_content"
        android:layout_below="@id/reset_button"
        android:layout_centerHorizontal="true"
        android:onClick="resetScore"
        android:text="@string/reset_button" />

</RelativeLayout>

您可以简单地使用 Spinner.setSelection(int position) 方法并为第一项传递 0

当您第一次启动应用程序时,您的微调器会显示“Team A”或“Team B”,因为您已将它们定义为字符串资源,然后在 xml 文件中将它们引用为 android:text="@string/team_b"。 旋转器将继续显示 A 队或 B 队,直到您触摸它们。 一旦你触摸它们,就会开始覆盖 xml 定义。

有多种方法可以解决这个问题,但我只会重新生成微调器。

在您的活动代码中,使用名为“populateSpinnerA()”的方法并在 onCreate 语句中调用该方法,而不是对微调器进行硬编码。 然后,当您按下重置按钮时,再次调用 populateSpinnerA() 方法以使用其原始字符串引用从头开始完全重新创建微调器。

您还可以使用 -1 来显示提示而不是第一项:

mySpinner.setSelection(-1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM