【问题标题】:Android: Why is subsequent code preventing .setText() for TextView from workingAndroid:为什么后续代码会阻止 TextView 的 .setText() 工作
【发布时间】:2016-08-05 23:40:45
【问题描述】:

更新:我在调用updatePercentage 后发现代码阻止.setText 工作。我更新了下面的代码以显示从 button_Convert 对 calcAndDisplayResults 的调用,以及 calcAndDisplayResults 的代码。当我删除对calcAndDisplayResults 的调用时,.setText 在此调用正常工作之前。为什么后面的代码会阻止前面的代码工作?

我正在尝试使用 .setText() 更新 TextView 对象的文本,以在 content_main 布局(包含在 activity_main 布局中)上显示更新的完成百分比值。我正在通过我编写的名为updatePercentage 的私有方法更新文本,当按下各种按钮时,该方法从MainActivityonClick 方法调用。当从 onClick 中的某些位置调用 updatePercentage 而不是从其他位置调用时,.setText 起作用(即更新 TextView 的文本)。具体来说,它在输入onClick 方法时起作用,在单击button_3 时起作用,但在单击button_Convert 时不起作用(即不更新TextView 的文本)。 button_Convert switch case中的其他方法(在updatePercentage之后调用)正常工作。

我搜索了 StackOverflow 数据库,发现其他人提出了setText 的问题,但似乎没有人能解决我遇到的问题。我的开发环境是 Android Studio (2.1.2),包含所有已知的相关更新。我在使用 AVD 设备 Galaxy Nexus API 23 时遇到了问题。我是 Android/Java 新手,非常感谢您的帮助。

这是我的代码的相关部分。

MainActivity.java:

...
import android.widget.TextView;
...

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
...
private TextView percentComplete;
...

@Override
protected void onCreate(Bundle savedInstanceState) {
    final String METHOD = "Method: onCreate";
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    percentComplete = (TextView) findViewById(R.id.textView_PercentCompleteValue);
    ...

}

...

@Override
public void onClick(View view) {
    final String METHOD = "Method: onClick";

    currentValue = valueToConvert.getText().toString();

    int progressUpdate = 0;
    updatePercentage(progressUpdate);  //This one works...text updated to 0%

    ArrayList<String> goodWords = new ArrayList<>();

    Results_Adapter resultsAdapter = new Results_Adapter(this, goodWords);
    listResults.setAdapter(resultsAdapter);

    switch (view.getId()) {

        ...

        case R.id.button_3:
            valueToConvert.setText(String.format(Locale.US, "%s%s", currentValue, "3"));

            progressUpdate = 3;
            updatePercentage(progressUpdate);  //This one works...text updated to 3%

            break;

        ...

        case R.id.button_Convert:
            progressUpdate = 20;
            updatePercentage(progressUpdate);  //This one doesn't work...text stays 0% or 3%, depending if I've clicked button_3 first

            calcAndDisplayResults();  //If I remove the call to this method, the code for updatePercentage works ????

            break;
    }
}

private void calcAndDisplayResults (){
    final String METHOD = "Method: calcAndDisplayResults";
    ArrayList<String> goodWords = new ArrayList<>();

    currentValue = valueToConvert.getText().toString();
    goodWords = convertNumbersToWords(currentValue);
    if (goodWords.size() == 0) {
        goodWords.add("<No equivalent words!>");
    }
    Results_Adapter resultsAdapter = new Results_Adapter(this, goodWords);
    listResults.setAdapter(resultsAdapter);
}

private void updatePercentage (int newPercentage){
    final String METHOD = "Method: updatePercentage";
    Log.v(LOG_CLASS, String.format(Locale.US, "%s; newPercentage: %d%%", METHOD, newPercentage));
    this.percentComplete.setText(String.format(Locale.US, "%d%%", newPercentage));
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    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"
    android:fitsSystemWindows="true"
    android:background="@color/md_grey_200"
    tools:context="com.psmithe.combowords.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main"/>

</android.support.design.widget.CoordinatorLayout>

content_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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.psmithe.combowords.MainActivity"
    tools:showIn="@layout/activity_main"
    >

    <TextView
        android:id="@+id/textView_CodeToCovert"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp"
        android:layout_marginEnd="50dp"
        android:layout_marginLeft="50dp"
        android:layout_marginRight="50dp"
        android:layout_marginStart="50dp"
        android:background="@drawable/textview_border"
        android:textAlignment="center"
        android:textSize="24sp"/>

    <GridLayout
        android:id="@+id/gridLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/textView_CodeToCovert"
        android:layout_centerHorizontal="true">

        <Button
            android:id="@+id/button_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_column="0"
            android:layout_gravity="center"
            android:layout_row="0"
            android:backgroundTint="@color/colorNumberKeys"
            android:clickable="true"
            android:gravity="center_vertical|center_horizontal"
            android:maxWidth="120dp"
            android:minHeight="50dp"
            android:minWidth="90dp"
            android:onClick="onClick"
            android:text="1"
            android:textSize="12sp"/>

        <Button
            android:id="@+id/button_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_column="1"
            android:layout_gravity="center"
            android:layout_row="0"
            android:backgroundTint="@color/colorNumberKeys"
            android:clickable="true"
            android:maxWidth="120dp"
            android:minHeight="50dp"
            android:minWidth="90dp"
            android:onClick="onClick"
            android:text="2\n(A B C)"
            android:textSize="12sp"/>

        <Button
            android:id="@+id/button_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_column="2"
            android:layout_gravity="center"
            android:layout_row="0"
            android:backgroundTint="@color/colorNumberKeys"
            android:clickable="true"
            android:maxWidth="120dp"
            android:minHeight="50dp"
            android:minWidth="90dp"
            android:onClick="onClick"
            android:text="3\n(D E F)"
            android:textSize="12sp"/>

        ...

        <Button
            android:id="@+id/button_Convert"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_column="0"
            android:layout_columnSpan="100"
            android:layout_row="4"
            android:backgroundTint="@color/colorConvertKey"
            android:clickable="true"
            android:onClick="onClick"
            android:text="Convert To Words"
            android:textColor="@color/abc_primary_text_material_dark"/>

    </GridLayout>

    <LinearLayout
        android:id="@+id/linearLayout_percentComplete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/gridLayout"
        android:layout_centerHorizontal="true"
        android:gravity="center_horizontal"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/textView_percentCompleteLabel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Percent Complete:"/>

        <TextView
            android:id="@+id/textView_PercentCompleteValue"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text=""/>
    </LinearLayout>

    <ListView
        android:id="@+id/listView_EquivalentWords"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linearLayout_percentComplete"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:background="@color/colorListViewBackground"/>

</RelativeLayout>

【问题讨论】:

  • 我还注意到,当我单击 button_Convert 时,onClick 开头的第一次调用 updatePercentage(即在 switch 部分之前的调用)不会将文本值更新为 0 %。如果我单击任何其他按钮,则相同的调用有效。此外,updatePercentage 的 logcat 输出显示正确的值,即使是从 button_Convert 开关盒调用时也是如此。
  • 如果您尝试延迟发布calcAndDisplayResults 方法,您是否看到正确的百分比值闪烁?
  • @JMLord,哇!您的评论使我在另一个线程上运行calcAndDisplayResults,这导致updatePercentage 正常工作(一旦我调整updatePercentage 以将.setText 发布到UI 线程)。您想发表您的评论作为答案,以便我接受吗?
  • 好吧,让我们这样做:) 很高兴我的问题帮助了你!

标签: java android android-studio textview settext


【解决方案1】:

您的setText() 似乎已被覆盖。

如果您尝试延迟发布calcAndDisplayResults 方法,您是否看到正确的百分比值闪烁?

【讨论】:

    【解决方案2】:

    尝试在 onClick(View view) 方法之前删除 @override 并且您不需要实现 View.OnClickListener(after AppCompatActivity) 。原因是你已经在你的xml文件中为按钮定义了onClickListener,即button_Convert,有一行android:onClick="onClick"表示如果你点击这个按钮,它将调用方法onClick

    【讨论】:

    • 感谢您的建议和信息,@Arron。不幸的是,这些更改并没有解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 2014-02-14
    • 1970-01-01
    • 2020-04-20
    • 2011-08-16
    • 2018-10-12
    • 1970-01-01
    • 2017-02-08
    相关资源
    最近更新 更多