【问题标题】:How to reset selected item in MDC spinner (AutoCompleteTextview/ ExposedDropdownMenu) with press of a button如何通过按下按钮重置 MDC 微调器(AutoCompleteTextview/ExposedDropdownMenu)中的选定项目
【发布时间】:2019-09-24 10:19:15
【问题描述】:

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

Better visual of the app

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>

【问题讨论】:

  • 您是否以某种方式解决了这个问题?我想要做的就是能够像文本字段一样清除它

标签: java android drop-down-menu material-design spinner


【解决方案1】:

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

【讨论】:

  • 问题在于这不是一个常规的微调器,它是一个具有微调器功能的 AutocompleteTextView,它是新材料设计组件的一部分。
【解决方案2】:

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

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

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

【讨论】:

  • 我按照你的建议做了,我创建了两个方法“populateSpinnerA()”和“populateSpinnerB()”,并在 onCreate 语句中调用它们。我在 resetScore 下调用了这两个方法,但微调器保持不变。他们仍然保留他们选择的状态。 public void resetScore(View v) { scoreTeamA = 0; scoreTeamB = 0; displayForTeamA(scoreTeamA); displayForTeamB(scoreTeamB); populateSpinnerA(); populateSpinnerB(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多