【问题标题】:Save a double value from textView to a variable将 textView 中的双精度值保存到变量中
【发布时间】:2017-02-04 15:20:26
【问题描述】:

我正在制作一个地理编码器反向地理编码器。
坐标在我想进一步用于反向地理编码的文本视图中生成。
问题是当我尝试将 textview 的内容保存到变量中时,应用程序突然停止工作。
LATITUDE = Double.parseDouble(t.getText().toString());
LATITUDE 是变量,t 是其中坐标的textView已生成。

有没有其他方法可以将 double 值从 textView 保存到变量中,以便进一步使用。
如果不行,能否解决这个问题。

在此先感谢:)

这是我的java代码:

public class MainActivity extends Activity {

private Button b;
public TextView t;
public TextView u;
public TextView add;
private LocationManager locationManager;
private LocationListener listener;
public Button b2;
private EditText e;
double LATITUDE;
double LONGITUDE;





@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    t = (TextView) findViewById(R.id.textView);
    u = (TextView) findViewById(R.id.textView3);
    add = (TextView) findViewById(R.id.textView4);
    b = (Button) findViewById(R.id.button);
    b2 = (Button) findViewById(R.id.button2);
    e = (EditText) findViewById(R.id.editText);




    b2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String number = e.getText().toString();
            String loc = t.getText().toString();
            String loc1 = u.getText().toString();
            String loc2 = add.getText().toString();
            Intent sendIntent = new Intent(Intent.ACTION_VIEW);

            sendIntent.setData(Uri.parse("sms:"+number));
            sendIntent.putExtra("sms_body",loc+loc1+loc2);



            try {
                startActivity(sendIntent);
                finish();
                Log.i("Finished sending SMS...", "");
            }
            catch (android.content.ActivityNotFoundException ex) {
                Toast.makeText(MainActivity.this,
                        "SMS failed, please try again later.", Toast.LENGTH_SHORT).show();
            }
        }
    });

    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);


    listener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            t.append("\n " + location.getLatitude());
            u.append("\n " + location.getLongitude());
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

            Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(i);
        }
    };

    configure_button();
}



@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode){
        case 10:
            configure_button();
            break;
        default:
            break;
    }
}

void configure_button(){
    // first check for permissions
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.INTERNET}
                    ,10);
        }
        return;
    }
    // this code won't execute IF permissions are not allowed, because in the line above there is return statement.
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //noinspection MissingPermission
            locationManager.requestLocationUpdates("gps",15000,0, listener);
        }
    });
}

public void phone(View view) {
    Intent i = new Intent(this,Main2Activity.class);
    startActivity(i);

}

    public void address(View view) {

        LATITUDE = Double.parseDouble(t.getText().toString());
        LONGITUDE = Double.parseDouble(u.getText().toString());
        Geocoder geocoder = new Geocoder(this, Locale.ENGLISH);
        String result;
        try {

            List<Address> addressList = geocoder.getFromLocation(LATITUDE, LONGITUDE, 1);
            if (addressList != null && addressList.size() > 0) {
                Address address = addressList.get(0);
                StringBuilder sb = new StringBuilder();

                for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {
                    sb.append(address.getAddressLine(i));
                }
                sb.append("\n" + address.getLocality());
                sb.append("\n" + address.getPostalCode());
                sb.append("\n" + address.getCountryName());
                result = sb.toString();
                add.append(result);
            }
        }
        catch (IOException e) {
        }
    }
}

【问题讨论】:

    标签: java android textview double reverse-geocoding


    【解决方案1】:

    您正在通过以下行将新的坐标附加到 textView。 t.append("\n" + location.getLatitude())

    所以现在当您阅读 textView 时,您会得到所有由 \n 分隔的值。尝试先拆分它,这样你就会得到一个字符串数组。然后运行一个循环将所有字符串转换为双精度。

    这是一个如何拆分字符串的示例

    String string = "004-034556";
    String[] parts = string.split("-");
    String part1 = parts[0]; // 004
    String part2 = parts[1]; // 034556
    

    【讨论】:

    • 如果我的应用程序由于坐标值众多而关闭,将使用这种情况。但即使文本视图中没有任何值,如果我单击实现反向地理编码器的按钮,应用程序也会关闭类。
    • 嘿,谢谢。我明白了。我犯了一个非常愚蠢的错误。我在 textView 中写了文本“纬度:”,我完全忘记了,直到你强调字符串部分。这让我意识到我已经在 textView 中写了一些东西......谢谢
    • 如果您找到了答案,请不要忘记将其标记为正确答案。
    【解决方案2】:

    为什么不在文本视图中追加时放入类级别的字符串数组。如此干净和安全的代码。在拆分过程中没有空指针的风险。

    【讨论】:

    • 感谢您的回复:)
    • 不客气。如果这个对你有帮助,请点赞。
    猜你喜欢
    • 2010-10-09
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多