質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

1回答

909閲覧

変数の初期化をする場所を変えることで、強制終了する。

kumamentanpin

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/12/17 10:00

編集2021/12/17 10:33

前提・実現したいこと

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; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/12/17 10:14 編集

コードの一部では無く、強制終了する状態の実行可能なコード・レイアウト全体をご提示願えますか。 少なくともそれらは「定義」ではなく、計算に必要なデータを取得しています。 それを外に出せば、計算できないでしょう。 なぜ必要な処理を外に出さなければならないのでしょうか。
m.ts10806

2021/12/17 10:09

「強制終了」とは何かエラー(例外など)が出ているのでしょうか、どういう状態になるのでしょうか。起きていることを具体的に記載してください。
kumamentanpin

2021/12/17 10:21

jimbe様 ご連絡有難うございます。 緯度経度を用いる、似たようなメソッドを他に用いる予定なので、そのメソッドにも8つのデータを書くと、量が多くなり煩雑なコードになると考えたためです。
kumamentanpin

2021/12/17 10:26

m.ts10806様 ご連絡有難うございます。 実機で動かす際に、載せているコードを書いたアクティビティに対するUIに画面遷移すると、強制終了をします。Android Studio上では、エラーは生じていないみたいです。
jimbe

2021/12/17 10:28

コード修正ありがとうございます。 ですが・・・最初のコード片とは「8つ」の位置が変わっています。 どちらが正しいのでしょうか。
jimbe

2021/12/17 10:31

> 緯度経度を用いる、似たようなメソッドを他に用いる予定なので であれば、それを書いてから改めてリファクタリングすることをお勧めします。 コードを最小限にするのであれば、経験が無いうちは、実際に2つ以上で利用する場面になってからリファクタリングするほうが良いと思います。
kumamentanpin

2021/12/17 10:46

jimbe様 承知しました。初めての投稿ということもあり、拙い説明で申し訳ございませんでした。リファクタリングに関しては、勉強不足なので、さっそく調べてみたいと思います。有難うございました。
guest

回答1

0

機能とコードを整理しつつというところで、例えば以下のようなコードにもなり得ます。(とりあえずサンプルとして不要・不明な部分は削除・コメントしています)

GlobalPosition というクラスを新設し、緯度経度の 2 つを保持させます。
この 2 つは、双方個々に対応する TextWatcher を TextView に addTextChangedListener することで、 TextView が変更されると自動的に値が更新されます。
getDistance メソッドを GlobalPosition に移し、自分の座標からパラメータで渡される座標までを計算させるようにすると、 btn_distance_to_home のクリック処理では nowGP.getDistance(homeGP) の結果を表示するだけで済むようになります。

他にあるという緯度経度を用いる処理でも、 GlobalPosition に入れるか GlobalPosition をパラメータとして使用すれば、見た目ある程度は整理されるのではないでしょうか。

java

1package com.teratail.q374330; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.location.Location; 6import android.os.Bundle; 7import android.text.*; 8import android.widget.*; 9 10//import com.google.android.gms.location.*; 11 12public class DistanceActivity extends AppCompatActivity { 13 14 //private FusedLocationProviderClient fusedLocationClient; 15 16 private TextView homeLatitudeTextView; 17 private TextView homeLongitudeTextView; 18 private TextView nowLatitudeTextView; 19 private TextView nowLongitudeTextView; 20 private TextView distanceToHomeTextView; 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.activity_distance); 26 27 // 各View取得 28 homeLatitudeTextView = findViewById(R.id.home_latitude); 29 homeLongitudeTextView = findViewById(R.id.home_longitude); 30 nowLatitudeTextView = findViewById(R.id.now_latitude); 31 nowLongitudeTextView = findViewById(R.id.now_longitude); 32 distanceToHomeTextView = findViewById(R.id.num_distance_to_home); 33 34 //GlobalPosition オブジェクト設定 35 GlobalPosition homeGP = new GlobalPosition(1,2); 36 homeLatitudeTextView.addTextChangedListener(homeGP.getLatitudeTextWatcher()); 37 homeLongitudeTextView.addTextChangedListener(homeGP.getLongitudeTextWatcher()); 38 39 GlobalPosition nowGP = new GlobalPosition(3,4); 40 nowLatitudeTextView.addTextChangedListener(nowGP.getLatitudeTextWatcher()); 41 nowLongitudeTextView.addTextChangedListener(nowGP.getLongitudeTextWatcher()); 42 43 // LocationClientクラスのインスタンスを生成 44 //fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); 45 46 // 位置情報取得開始 47 //startUpdateLocation(); 48 49 Button registerMyHomeButton = findViewById(R.id.register_my_home); 50 registerMyHomeButton.setOnClickListener(v -> { 51 homeLatitudeTextView.setText(nowLatitudeTextView.getText().toString()); 52 homeLongitudeTextView.setText(nowLongitudeTextView.getText().toString()); 53 }); 54 55 //ボタンを押すと、距離を算出してくれる 56 Button distanceToHomeButton = findViewById(R.id.btn_distance_to_home); 57 distanceToHomeButton.setOnClickListener(v -> { 58 distanceToHomeTextView.setText(""+nowGP.getDistance(homeGP)); 59 }); 60 } 61} 62 63class GlobalPosition { 64 private double latitude; //緯度 65 private double longitude; //経度 66 67 GlobalPosition() {} 68 69 //テスト用 70 GlobalPosition(double latitude, double longitude) { 71 this.latitude = latitude; 72 this.longitude = longitude; 73 } 74 75 double getLatitude() { return latitude; } 76 double getLongitude() { return longitude; } 77 78 /* 79 * to までの距離(メートル) 80 */ 81 float getDistance(GlobalPosition to) { 82 // 結果を格納するための配列を生成 83 float[] results = new float[3]; 84 85 // 距離計算 86 Location.distanceBetween(latitude, longitude, to.latitude, to.longitude, results); 87 88 return results[0]; 89 } 90 91 private double getDouble(Editable editable) { 92 try { 93 return Double.parseDouble(editable.toString()); 94 } catch(NumberFormatException e) { 95 return 0.0; 96 } 97 } 98 99 TextWatcher getLatitudeTextWatcher() { 100 return new TextWatcher() { 101 @Override 102 public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} //ignore 103 @Override 104 public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} //ignore 105 @Override 106 public void afterTextChanged(Editable editable) { 107 latitude = getDouble(editable); 108 } 109 }; 110 } 111 112 TextWatcher getLongitudeTextWatcher() { 113 return new TextWatcher() { 114 @Override 115 public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} //ignore 116 @Override 117 public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} //ignore 118 @Override 119 public void afterTextChanged(Editable editable) { 120 longitude = getDouble(editable); 121 } 122 }; 123 } 124}

投稿2021/12/17 11:46

編集2021/12/17 11:58
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問