前提・実現したいこと
Android Studio を用いて、スマホアプリを開発しています。
ボタンを押すと、距離を算出して画面に表示するプログラミングを作っており、わからないことがあるのです。
緯度経度を定義している部分(8つ)をリスナの外に出したいのですが、強制終了してしまいます。
リスナの中に定義すると、実行はするのですが、できればリスナ外で定義をしたいです。
どのようにすれば宜しいでしょうか?
該当のソースコード
public class DistanceActivity extends AppCompatActivity { private FusedLocationProviderClient fusedLocationClient; TextView home_latitude; TextView write_latitude; TextView home_longitude; TextView write_longitude; TextView set_distance; EditText assumed_distance; TextView now_latitude; TextView now_longitude; TextView num_distance_to_home; String num_distance_to_home2; double num_distance_to_home3; String set_distance2; double set_distance3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_distance); // LocationClientクラスのインスタンスを生成 fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); // 位置情報取得開始 startUpdateLocation(); //こちらに以下の8つを置きたい。 Button register_myHome = findViewById(R.id.register_my_home); register_myHome.setOnClickListener(v -> { home_latitude = findViewById(R.id.home_latitude); write_latitude = findViewById(R.id.now_latitude); String text1 = write_latitude.getText().toString(); home_latitude.setText(text1); home_longitude = findViewById(R.id.home_longitude); write_longitude = findViewById(R.id.now_longitude); String text2 = write_longitude.getText().toString(); home_longitude.setText(text2); }); home_latitude = findViewById(R.id.home_latitude); home_longitude = findViewById(R.id.home_longitude); //ボタンを押すと、距離を算出してくれる仕組み //distance[0]は2地点間の距離 Button btn_distance_to_home = findViewById(R.id.btn_distance_to_home); btn_distance_to_home.setOnClickListener(v -> { //以下の8つ String now_latitude2 = now_latitude.getText().toString(); String now_longitude2 = now_longitude.getText().toString(); double now_latitude3 = Double.parseDouble(now_latitude2); double now_longitude3 = Double.parseDouble(now_longitude2); String home_latitude2 = home_latitude.getText().toString(); String home_longitude2 = home_longitude.getText().toString(); double home_latitude3 = Double.parseDouble(home_latitude2); double home_longitude3 = Double.parseDouble(home_longitude2); //以上 float[] distance = getDistance(now_latitude3, now_longitude3, home_latitude3, home_longitude3); String dis = String.valueOf(distance[0]); num_distance_to_home = findViewById(R.id.num_distance_to_home); num_distance_to_home.setText(dis); }); num_distance_to_home = findViewById(R.id.num_distance_to_home); } /* * 2点間の距離(メートル)、方位角(始点、終点)を取得 * ※配列で返す[距離、始点から見た方位角、終点から見た方位角] */ public float[] getDistance(double x, double y, double x2, double y2) { // 結果を格納するための配列を生成 float[] results = new float[3]; // 距離計算 Location.distanceBetween(x, y, x2, y2, results); return results; } }
コードの一部では無く、強制終了する状態の実行可能なコード・レイアウト全体をご提示願えますか。
少なくともそれらは「定義」ではなく、計算に必要なデータを取得しています。
それを外に出せば、計算できないでしょう。
なぜ必要な処理を外に出さなければならないのでしょうか。
「強制終了」とは何かエラー(例外など)が出ているのでしょうか、どういう状態になるのでしょうか。起きていることを具体的に記載してください。
jimbe様
ご連絡有難うございます。
緯度経度を用いる、似たようなメソッドを他に用いる予定なので、そのメソッドにも8つのデータを書くと、量が多くなり煩雑なコードになると考えたためです。
m.ts10806様
ご連絡有難うございます。
実機で動かす際に、載せているコードを書いたアクティビティに対するUIに画面遷移すると、強制終了をします。Android Studio上では、エラーは生じていないみたいです。
コード修正ありがとうございます。
ですが・・・最初のコード片とは「8つ」の位置が変わっています。
どちらが正しいのでしょうか。
> 緯度経度を用いる、似たようなメソッドを他に用いる予定なので
であれば、それを書いてから改めてリファクタリングすることをお勧めします。
コードを最小限にするのであれば、経験が無いうちは、実際に2つ以上で利用する場面になってからリファクタリングするほうが良いと思います。
jimbe様
承知しました。初めての投稿ということもあり、拙い説明で申し訳ございませんでした。リファクタリングに関しては、勉強不足なので、さっそく調べてみたいと思います。有難うございました。