Android:为什么后续代码阻止 TextView 的 .setText() 工作
Android: Why is subsequent code preventing .setText() for TextView from working
更新:我发现调用 updatePercentage
后的代码阻止 .setText
工作。我更新了下面的代码以显示从 button_Convert 调用 calcAndDisplayResults
以及 calcAndDisplayResults
的代码。当我删除对 calcAndDisplayResults
的调用时,此调用之前的 .setText
正常工作。为什么后面的代码会阻止前面的代码工作?
我正在尝试使用 .setText()
更新 TextView
对象的文本,以在 content_main 布局(包含在 activity_main布局)。我正在通过我编写的名为 updatePercentage
的私有方法更新文本,当按下各种按钮时,该方法会从 MainActivity
的 onClick
方法调用。当从 onClick
中的某些位置调用 updatePercentage 而不是从其他位置调用时,.setText
起作用(即更新 TextView
的文本)。具体来说,它在输入 onClick
方法时起作用,在单击 button_3 时起作用,但在 [=52= 时不起作用(即不更新 TextView
的文本) ] 被点击。 button_Convert switch case 中的其他方法(在 updatePercentage
之后调用)正常工作。
我搜索了 Whosebug 数据库,发现其他人有 setText
个问题,但 none 似乎解决了我遇到的问题。我的开发环境是 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>
尝试删除 onClick(View view)
方法之前的 @override
并且您不需要实施 View.OnClickListener
(after AppCompatActivity) 。原因是您已经在 xml 文件中为按钮定义了 onClickListener,即对于 button_Convert
,有一行 android:onClick="onClick"
表示如果您单击此按钮,它将调用方法 onClick
。
您的 setText()
似乎被覆盖了。
如果您尝试延迟发布 calcAndDisplayResults
方法,您是否看到正确的百分比值闪烁?
更新:我发现调用 updatePercentage
后的代码阻止 .setText
工作。我更新了下面的代码以显示从 button_Convert 调用 calcAndDisplayResults
以及 calcAndDisplayResults
的代码。当我删除对 calcAndDisplayResults
的调用时,此调用之前的 .setText
正常工作。为什么后面的代码会阻止前面的代码工作?
我正在尝试使用 .setText()
更新 TextView
对象的文本,以在 content_main 布局(包含在 activity_main布局)。我正在通过我编写的名为 updatePercentage
的私有方法更新文本,当按下各种按钮时,该方法会从 MainActivity
的 onClick
方法调用。当从 onClick
中的某些位置调用 updatePercentage 而不是从其他位置调用时,.setText
起作用(即更新 TextView
的文本)。具体来说,它在输入 onClick
方法时起作用,在单击 button_3 时起作用,但在 [=52= 时不起作用(即不更新 TextView
的文本) ] 被点击。 button_Convert switch case 中的其他方法(在 updatePercentage
之后调用)正常工作。
我搜索了 Whosebug 数据库,发现其他人有 setText
个问题,但 none 似乎解决了我遇到的问题。我的开发环境是 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>
尝试删除 onClick(View view)
方法之前的 @override
并且您不需要实施 View.OnClickListener
(after AppCompatActivity) 。原因是您已经在 xml 文件中为按钮定义了 onClickListener,即对于 button_Convert
,有一行 android:onClick="onClick"
表示如果您单击此按钮,它将调用方法 onClick
。
您的 setText()
似乎被覆盖了。
如果您尝试延迟发布 calcAndDisplayResults
方法,您是否看到正确的百分比值闪烁?