【问题标题】:how to handle with addTextChangedListener and memory如何处理 addTextChangedListener 和内存
【发布时间】:2017-06-25 18:31:13
【问题描述】:
public class MainActivity extends AppCompatActivity {

EditText Percent, mmolGlic, mgGlic;

double mmol = 0, mg = 0, perc = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Percent = (EditText) findViewById(R.id.percent);
    mmolGlic = (EditText) findViewById(R.id.mmol_glic);
    mgGlic = (EditText) findViewById(R.id.mg_glic);



    /*mmolGlic.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            frommMol();
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });*/

    Percent.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            fromPercent();
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    /*mgGlic.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            frommg();
        }
    });*/
}

public void frommMol() {
    mmol = Double.parseDouble(mmolGlic.getText().toString());
    perc = (mmol/10.929) + 2.15;
    Percent.setText(String.format( "%.2f", perc ));
}

public void fromPercent(){
    perc = Double.parseDouble(Percent.getText().toString());
    mmol = (perc - 2.15) * 10.929;
    mmolGlic.setText(String.format( "%.2f", mmol ));
    mg = (perc*28.7) - 46.7;
    mgGlic.setText(String.format( "%.2f", mg ));
}

public void frommg(){
    mg = Double.parseDouble(mgGlic.getText().toString());
    perc = (mg + 46.7) / 28.7;
    Percent.setText(String.format( "%.2f", perc ));


}

}

大家早上好:)

这是一个连续的问题:Question 1

这是我正在尝试做的示例代码。但我有一些问题。我认为其中大部分是针对变量的逻辑以及如何处理更多 EditTexts 中的输入。例如:

  1. 主要问题是我不能使用多个addTextChangedListener。我试图更好地解释:如果我将代码保留在这里,应用程序就会崩溃。我不确定,可能是因为我处理三个 EditText 的方式。
  2. 然后我在删除文本时遇到问题:如果我有“5.99”并且我 按del,删除时会删除,直到5,然后 崩溃。可能我应该在文本字段为空时设置 变量 = 0。

你能帮帮我吗?非常感谢

【问题讨论】:

    标签: android android-studio android-activity android-edittext


    【解决方案1】:
    public class MainActivity extends AppCompatActivity {
    
    EditText Percent, mmolGlic, mgGlic;
    
    double mmol = 0, mg = 0, perc = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Percent = (EditText) findViewById(R.id.percent);
        mmolGlic = (EditText) findViewById(R.id.mmol_glic);
        mgGlic = (EditText) findViewById(R.id.mg_glic);
    
     Percent.addTextChangedListener(percentWatcher);
            mmolGlic.addTextChangedListener(mmolGlicTextWatcher);
            mgGlic.addTextChangedListener(mgGlicWatcher);
    }
    
     public void frommMol() {
            if (!mmolGlic.getText().toString().trim().isEmpty()) {
                mmol = Double.parseDouble(mmolGlic.getText().toString());
                perc = (mmol / 10.929) + 2.15;
                Percent.removeTextChangedListener(percentWatcher);
                Percent.setText(String.format("%.2f", perc));
                Percent.addTextChangedListener(percentWatcher);
            }
        }
    
        public void fromPercent() {
            if (!Percent.getText().toString().trim().isEmpty()) {
                perc = Double.parseDouble(Percent.getText().toString().trim());
                mmol = (perc - 2.15) * 10.929;
                mmolGlic.removeTextChangedListener(mmolGlicTextWatcher);
                mgGlic.removeTextChangedListener(mgGlicWatcher);
                mmolGlic.setText(String.format("%.2f", mmol));
                mg = (perc * 28.7) - 46.7;
                mgGlic.setText(String.format("%.2f", mg));
                mmolGlic.addTextChangedListener(mmolGlicTextWatcher);
                mgGlic.addTextChangedListener(mgGlicWatcher);
            }
        }
    
        public void frommg() {
            if (!mgGlic.getText().toString().trim().isEmpty()) {
                mg = Double.parseDouble(mgGlic.getText().toString());
                perc = (mg + 46.7) / 28.7;
                Percent.removeTextChangedListener(percentWatcher);
                Percent.setText(String.format("%.2f", perc));
                Percent.addTextChangedListener(percentWatcher);
            }
        }
    
    
        private TextWatcher percentWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                fromPercent();
            }
    
            @Override
            public void afterTextChanged(Editable editable) {
    
            }
        };
    
        private TextWatcher mgGlicWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                frommg();
            }
    
            @Override
            public void afterTextChanged(Editable editable) {
    
            }
        };
    
        private TextWatcher mmolGlicTextWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    frommMol();
            }
    
            @Override
            public void afterTextChanged(Editable editable) {
    
            }
        };
    
    }
    
    
    Hope this will help you.
    

    【讨论】:

    • 非常感谢
    • 你能解释一下你做了什么吗?只是为了更好地理解它
    • 我已经为所有 3 个 edittext 分别创建了 3 个 textwatcher。并且从每种计算方法中,我先进行计算,然后在将文本设置为 edittext 之前删除其他 textwatcher,因为如果我不删除 textwatcher 和 setText 到 edittext,那么它将开始相互递归调用。然后我再次将 textwatcher 侦听器设置为我之前删除的那些侦听器,它通常像以前一样工作。
    • 啊,好吧。我问你最后一件事:当我从一个 editText 中删除值时,我如何从另一个中删除值?
    • 您可以在 onTextChanged 中检查长度,因此当您获得长度 0 时,清除其他两个的编辑文本。
    【解决方案2】:

    好吧,即使您没有任何可使用的文本,您也正在执行您的操作。我建议您在执行 thefromPercent() 之前对 editTextView 进行空/空检查;手术。希望对您有所帮助。

    【讨论】:

    • 类似于检查 EditText 是否为空,"", variables = 0 (?)
    • 是的......像这样的东西。 if((!Percent.getText().toString().isEmpty())&&(Percent.getText().toString()!=null)){ // 做你的工作}
    • 它有效。但是,如果我对所有三个 EditText 使用 addTextChangedListsener ,它就会崩溃。也许是因为它在每个 EditText 的值更改期间执行操作。不知道我解释的好不好。
    • @androidCoder-BD 非常感谢。它仍然在崩溃。我有一些问题,从editText中删除一个值后,如何将变量的值设置为0
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 2013-03-13
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2017-07-02
    相关资源
    最近更新 更多