Android - .setText()和invalidate()不能只在一个类中工作

时间:2016-04-12 14:44:28

标签: java android

所以这是我的代码:

package org.skaza.pocketamati.CalculatorActivities;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.skaza.pocketamati.R;

public class SizeViolinActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_size_violin);
    setTitle(getResources().getText(R.string.sizeViolin));

}

String violinSize = "NaN";
double bodyLength = 0;
int indicator = 0;

public void Compute(View v) {
    InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

    EditText bodyLengthText = (EditText) findViewById(R.id.sizeViolinInput);

    if (bodyLengthText
            .getText()
            .toString()
            .matches("\\d+(\\.\\d*)?|\\.\\d+")) {
        bodyLength = Double.parseDouble(bodyLengthText
                .getText()
                .toString());
    } else {
        Context context = getApplicationContext();
        CharSequence text = "Incorrect value";
        int length = Toast.LENGTH_SHORT;
        Toast error = Toast.makeText(context, text, length);
        error.show();
    }

    if (bodyLength >= 280 && bodyLength < 300) {indicator = 1;}
    if (bodyLength >= 300 && bodyLength < 320) {indicator = 2;}
    if (bodyLength >= 320 && bodyLength <= 340){indicator = 3;}
    if (bodyLength >= 350 && bodyLength <= 360){indicator = 4;}

    switch (indicator){
        case 1: violinSize = "1/4"; break;
        case 2: violinSize = "1/2"; break;
        case 3: violinSize = "3/4"; break;
        case 4: violinSize = "4/4"; break;
        default: break;}
    }

    TextView sizeTextView = (TextView) findViewById(R.id.sizeView);
    sizeTextView.setText(violinSize);
    sizeTextView.invalidate();

}

在整个应用程序中似乎无法使用的唯一两行是

    sizeTextView.setText(violinSize);
    sizeTextView.invalidate();

这两个在我的应用程序的其他部分工作但不在这里。我不得不使缓存失效并重启,因为我的所有符号都是这样的。现在我已经坚持使用这两个,我无法在互联网上找到解决方案。

3 个答案:

答案 0 :(得分:0)

从哪里调用Compute?如果它是从线程或类似的东西调用的 - 你需要在UI线程上使用setText。

答案 1 :(得分:0)

fisrt你必须在不在主类定义中的方法内启动变量:

  TextView sizeTextView = (TextView) findViewById(R.id.sizeView);

在onCreate方法中设置sizeTextView = (TextView) findViewById(R.id.sizeView);,然后在方法中进行下一次调用

答案 2 :(得分:0)

问题不在于设置文本,在你的开关正上方,你有一个不应该在那里的右括号。这阻止了你的建设。

    switch (indicator){
        case 1: violinSize = "1/4"; break;
        case 2: violinSize = "1/2"; break;
        case 3: violinSize = "3/4"; break;
        case 4: violinSize = "4/4"; break;
        default: break;} // <- this '}' right here can be removed
    }

如果删除那个,它就会编译。

BTW,在下面一行中,您也可以删除this,因为INPUT_METHOD_SERVICE已定义为静态

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);