2016-08-21 60 views
1

我是Android開發人員的初學者。我在我的應用程序,我有GPS和導航抽屜工作。我的目標是在一個片段中顯示座標。我有應用程序將GPS數據輸入到logcat,現在我試圖從onLocationChanged方法更改TextvView上的文本。更改onCreateView中的文本完美無瑕。當TextView在片段內的onLocationChanged內更改時,應用程序崩潰

它的工作原理是這樣的:

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    myView = inflater.inflate(R.layout.fragment_gps, container, false); 

    gpsLongitude = (TextView) myView.findViewById(R.id.gps_longitude); 
    gpsLongitude.setText("something"); 

    return myView; 
} 

但不是當我這樣做:

private double longitude; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    myView = inflater.inflate(R.layout.fragment_gps, container, false); 

    gpsLongitude = (TextView) myView.findViewById(R.id.gps_longitude); 

    return myView; 
} 

... 

public void onLocationChanged(Location location) { 

    Log.e("GPS", "found signal"); 
    longitude = location.getLongitude(); 
    gpsLongitude.setText("Longitude: " + Double.toString(longitude)); 

} 

我得到:

顯示java.lang.NullPointerException:試圖調用虛擬方法'null'對象上的'android.view.View android.view.View.findViewById(int)'參考

(出現這種情況之後,我得到:E/GPS:發現在logcat的信號)

如果我這樣做:

public void onLocationChanged(Location location) { 

    gpsLongitude = (TextView) getView().findViewById(R.id.gps_longitude); 
    gpsLongitude.setText("Longitude: " + Double.toString(longitude)); 
} 

同樣的事情發生:

的java .lang.NullPointerException:嘗試調用空對象上的虛擬方法'android.view.View android.view.View.findViewById(int)'參考

這樣做:

public void onLocationChanged(Location location) { 

    gpsLongitude = (TextView) getView().findViewById(R.id.gps_longitude); 
    gpsLongitude.setText("something"); 

} 

結果:

顯示java.lang.NullPointerException:嘗試調用虛擬方法 'android.view.View android.view.View.findViewById(INT)'空對象對參考

XML:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 
    <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/gps_longitude" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Longitude" 
     android:textSize="40dp" 
     android:textAlignment="center" 
     android:layout_margin="10dp"/> 
    <TextView 
     android:id="@+id/gps_latitude" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Latitude" 
     android:textSize="40dp" 
     android:textAlignment="center" 
     android:layout_margin="10dp"/> 
    <TextView 
     android:id="@+id/gps_altitude" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Altitude" 
     android:textSize="40dp" 
     android:textAlignment="center" 
     android:layout_margin="10dp"/> 
    <TextView 
     android:id="@+id/gps_speed" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Speed" 
     android:textSize="40dp" 
     android:textAlignment="center" 
     android:layout_margin="10dp"/> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="75dp" 
     android:gravity="center"> 
     <Button 
      android:onClick="onStartButtonClick" 
      android:id="@+id/gps_start" 
      android:layout_width="150dp" 
      android:layout_height="match_parent" 
      android:text="Start" 
      android:textSize="20dp"/> 
     <Button 
      android:onClick="onStopButtonClick" 
      android:id="@+id/gps_stop" 
      android:layout_width="150dp" 
      android:layout_height="match_parent" 
      android:text="Stop" 
      android:textSize="20dp"/> 

    </LinearLayout> 

</LinearLayout> 
</ScrollView> 

一直在尋找答案几個小時。

編輯:

MainActivity。Java的:

LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
    GPSFragment locationListener = new GPSFragment(); 
    if (android.os.Build.VERSION.SDK_INT > 23) { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{ 
        Manifest.permission.ACCESS_FINE_LOCATION 
      }, 10); 
      return; 
     } 
    } 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,locationListener); 
+0

你的滾動視圖XML,這是你的mainactivity的佈局? – TWL

+0

沒有那是片段的xml文件。但我發現下面我看到了一個解決方案,我爲那些可能會遇到同樣問題的人發佈瞭解決方案。 – slole

回答

0
private double longitude; 
private ViewGroup myView = null; 


@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    myView = inflater.inflate(R.layout.fragment_gps, container, false); 
    return myView; 
} 

public void onLocationChanged(Location location) { 

    Log.e("GPS", "found signal"); 
    if (null != myView) { 
     TextView gpsLongitude = (TextView) myView.findViewById(R.id.gps_longitude); 
     longitude = location.getLongitude(); 
     gpsLongitude.setText("Longitude: " + Double.toString(longitude)); 
    } 


} 
+0

這確實可以防止崩潰,但不會將信息顯示在文本視圖中 – slole

+0

TextView gpsLongitude =(TextView)getActivity()。findViewById(R.id.gps_longitude); longitude = location.getLongitude(); gpsLongitude.setText(「Longitude:」+ Double.toString(longitude)); – jibysthomas

+0

無論如何,仍然一樣謝謝你的答案。 – slole

0

通過您的視圖的方法,這樣

public void onLocationChanged(Location location, View view) { 

    gpsLongitude = (TextView) view.findViewById(R.id.gps_longitude); 
    gpsLongitude.setText("something"); 

} 

,當你打電話給你的方法通過視圖

onLocationChanged(location,myView); 
+0

現在它說:Class'GPSFragment'必須被聲明爲抽象或實現'LocationListener'中的抽象方法'onLocationChanged(Location)'注意:我有我的MainActivity.java中的GPS代碼。我已經更新了包含GPS代碼的問題。 – slole

-1

行,所以我找到了解決辦法:

private double longitude; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    myView = inflater.inflate(R.layout.fragment_gps, container, false); 

    gpsLongitude = (TextView) myView.findViewById(R.id.gps_longitude); 

    return myView; 
} 


public void showGPSData (View view) { 
    gpsLongitude.setText("Longitude: " + Double.toString(longitude)); 
} 


public void onLocationChanged(Location location) { 
    longitude = location.getLongitude(); 
    showGPSData(myView); 
} 

所以基本上我只是創建了一個方法,用於在文本視圖中更改文本(showGPSData),將文本視圖移動到onCreate並使得在位置更改時調用方法(showGPSData)。

+0

我不明白這與將gpsLongitude.setText(「Longitude:」+ Double.toString(longitude));'直接插入onLocationChanged是什麼不同。它與你所謂的「第一次失敗的嘗試」基本相同。甚至當你甚至沒有使用'showGPSData(View view)'時,甚至會傳遞'myView'? – TWL

+0

只是直接插入setText不起作用(這是我原來的問題,因爲當我這樣做時,應用程序只會在它調用onLocationChanged時崩潰) – slole

0

首先,確保你實施的android.location.LocationListener右側接口在Fragment

public class GPSFragment extends Fragment implements LocationListener { 
... 
} 

你應該要求requestLocationUpdatesonCreateView()

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    myView = inflater.inflate(R.layout.fragment_gps, container, false); 
    gpsLongitude = (TextView) myView.findViewById(R.id.gps_longitude); 

    LocationManager lm= (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE); 
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0, (android.location.LocationListener) this); 

    return myView; 
} 


@Override 
public void onLocationChanged(Location location) { 
    if(location==null){ 
     gpsLongitude.setText("Unknown location"); 
    }else { 
     Log.e("GPS", "found signal"); 
     double longitude = location.getLongitude(); 
     gpsLongitude.setText("Longitude: " + Double.toString(longitude)); 
    } 
} 
+0

謝謝你會嘗試這個asap – slole

+0

@slole,告訴我,如果這可能有所幫助。 :) –

+0

另一個快速的問題:將使用這種獲取位置的方法導致應用程序只跟蹤位於此片段中的位置,因爲我有多個片段,而且我希望它僅在此片段中跟蹤位置。 (我的目標是創建一個顯示不同傳感器數據的應用程序) – slole

相關問題