2017-12-27 66 views
0

アプリでは、アプリの起動時に現在地を取得したいと考えています。私のメインアクティビティ(最初のアクティビティ)では、まず場所(緯度と経度)を取得し、共有設定を保存します。その後、私はHomeFragmentを配置します。私はアプリが開いているときにHomeFragmentを見たいと思う。 私のHomeFragmentでは、距離を計算するために位置と緯度の情報を使うよりもsharedPrefreferencesを得たいと思っています。 しかし、これは動作しませんでした。私がアプリを起動すると、SharePreferencesを保存する前にHomeFragmentを配置します。アプリの起動時に場所を取得する方法

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
      MyLocation myLocation = new MyLocation(this); 
      myLocation.getLocation(this, locationResult); 
      super.onCreate(savedInstanceState); 

      setContentView(R.layout.activity_main); 

      FragmentTransaction tx = getSupportFragmentManager().beginTransaction(); 
      tx.replace(R.id.flContent, new HomeFragment()); 
      tx.commit(); 

     public MyLocation.LocationResult locationResult = new MyLocation.LocationResult() { 

      @Override 
      public void gotLocation(Location location) { 
       // TODO Auto-generated method stub 
       double Longitude = location.getLongitude(); 
       double Latitude = location.getLatitude(); 

       try { 
        System.out.println("lat"+Latitude); 
        System.out.println("long"+Longitude); 
        SharedPreferences locationpref = getApplication() 
          .getSharedPreferences("location", MODE_PRIVATE); 
        SharedPreferences.Editor prefsEditor = locationpref.edit(); prefsEditor.commit(); 
        prefsEditor.putString("Longitude", Longitude + ""); 
        prefsEditor.putString("Latitude", Latitude + ""); 


       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }; 

    } 

HomeFragment:私のマニフェストファイルの

public class HomeFragment extends Fragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 

     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 


     View rootView = inflater.inflate(R.layout.fragment_home, container, false); 
     listView = (ListView) rootView.findViewById(R.id.list); 
     adapter = new CustomListAdapter(getActivity(), restaurantList); 
     listView.setAdapter(adapter); 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Bundle bundle = new Bundle(); 
       bundle.putString("restaurantId", String.valueOf(restaurantList.get(position).getId())); 
       MenuLineItemFragment fragment2 = new MenuLineItemFragment(); 
       FragmentManager fragmentManager = getFragmentManager(); 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
       fragmentTransaction.replace(R.id.flContent, fragment2); 
       fragmentTransaction.addToBackStack(null); 
       fragmentTransaction.commit(); 

      } 
     }); 


     SharedPreferences pref = getActivity().getApplication().getSharedPreferences("location", MODE_PRIVATE); 
     latitude = pref.getString("Latitude",""); 
     longitude = pref.getString("Longitude",""); 

     if(i==1){ 
      request(); //I use longitude and latitude information in this method. 
      i++; 
     } 



     return rootView; 

    } 

、私が与える権限

は、ここに私のMainActivityです。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 

スタートアプリケーションで現在地を取得するにはどうすればよいですか?また、ユーザーの現在地がオフの場合はどうすればよいですか? Locationクラスメソッドの

答えて

0

いくつかは、そのようなgetLongitudegetLatitudeとしてバックグラウンドで実行されるので、のgetLocationは時間がかかるため、コードFragment初期化やgetLocationのどのラインを問題ではありません。あなたのコードで

: -

あなたが場所>Fragmentbackgroundに>getLocation仕上げ初期化され、​​>gotLocationに返された値を渡すゲットするためにバックグラウンドで実行されているGPS>getLocationを呼び出すことが呼び出されます。

ソリューション: -

まず道gotLocationfragmentを初期化であり、これは全くお勧めしません。

第二の方法sharedPrefreferencesに値を保存し、UIを更新(フラグメント)ときgotLocation終了(プログレスバーを使用すると呼ばれるにgotLocati enter code here後にそれを隠すでした)。

+0

お返事ありがとうございます。今、私は分かる。 gotLocationが完了するようにするにはどうすればよいですか?私の断片を置くことができるよりも。 @Mohamed Embaby – user8654574

+0

mainActivityでMainDelayedでRunnableを作成するか、必要な値を設定して、Runnable内でhasAltitudevalueをチェックしてください。もしfalseであればフラグメントを置き換えてください。runnableをもう一度実行して、カウンタを作って、無限ループでRunnableを呼び出さないようにしてください。 ... GPSがオンになっていて、インターネットアクセスがある場合、より効率的なチェックを最初に行います。 –

関連する問題