2017-05-31 8 views
0

私のアプリケーションに4つのフラグメントがあります。最初のものは、うまく動作する速度を計算するためのGPSデータを取得します。アプリケーションがgpsデータを取得して他のフラグメントに移動すると、クラッシュします。参考までに、他の断片はすべてコードなしです。ここフラグメントから別のフラグメントに移動するとアプリケーションがクラッシュする

は私のMainActivityクラスです:

package ir.helpx.speedx; 
 

 
import android.Manifest; 
 
import android.content.pm.ActivityInfo; 
 
import android.content.pm.PackageManager; 
 
import android.os.Build; 
 
import android.support.design.widget.TabLayout; 
 
import android.support.v4.app.ActivityCompat; 
 
import android.support.v4.content.ContextCompat; 
 
import android.support.v4.view.ViewPager; 
 
import android.support.v7.app.AppCompatActivity; 
 
import android.os.Bundle; 
 
import android.support.v7.widget.Toolbar; 
 
import android.view.WindowManager; 
 
import android.widget.Toast; 
 

 
public class MainActivity extends AppCompatActivity { 
 
    Toolbar toolbar; 
 
    TabLayout tabLayout; 
 
    ViewPager viewPager; 
 
    ViewPagerAdapter viewPagerAdapter; 
 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); 
 
     toolbar =(Toolbar)findViewById(R.id.toolBar); 
 
     setSupportActionBar(toolbar); 
 
     tabLayout = (TabLayout) findViewById(R.id.tabLayout); 
 
     viewPager = (ViewPager) findViewById(R.id.viewPager); 
 
     viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); 
 
     viewPagerAdapter.addFragments(new HomeFragment(), "Home"); 
 
     viewPagerAdapter.addFragments(new CompassFragment(), "Compass"); 
 
     viewPagerAdapter.addFragments(new HUDFragment(), "HUD"); 
 
     viewPager.setAdapter(viewPagerAdapter); 
 
     tabLayout.setupWithViewPager(viewPager); 
 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
 
     setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
 

 

 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
 
      ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1); 
 

 

 
    } 
 

 

 
    } 
 
    @Override 
 
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
 

 
     switch (requestCode) { 
 
      case 1: 
 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
 
        Toast.makeText(this,"GPS permission granted", Toast.LENGTH_LONG).show(); 
 

 
        // get Location from your device by some method or code 
 

 
       } else { 
 
        // show user that permission was denied. inactive the location based feature or force user to close the app 
 
       } 
 
       break; 
 
     } 
 
    } 
 
}

と私のMainActivityのXML:

<?xml version="1.0" encoding="utf-8"?> 
 
<android.support.constraint.ConstraintLayout 
 

 
    xmlns:android="http://schemas.android.com/apk/res/android" 
 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
 
    xmlns:tools="http://schemas.android.com/tools" 
 
    android:layout_width="match_parent" 
 
    android:layout_height="match_parent" 
 
    tools:context="ir.helpx.speedx.MainActivity"> 
 

 
    <android.support.design.widget.AppBarLayout 
 
     android:layout_height="wrap_content" 
 
     android:layout_width="368dp" 
 
     tools:layout_editor_absoluteY="0dp" 
 
     tools:layout_editor_absoluteX="8dp" 
 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
 

 
     <include 
 
      android:layout_height="wrap_content" 
 
      android:layout_width="match_parent" 
 
      layout="@layout/toolbar_layout" 
 
      /> 
 
     <android.support.design.widget.TabLayout 
 
      android:layout_width="match_parent" 
 
      android:layout_height="wrap_content" 
 
      android:id="@+id/tabLayout" 
 
      app:tabMode="fixed" 
 
      app:tabGravity="fill" 
 
     ></android.support.design.widget.TabLayout> 
 
     <android.support.v4.view.ViewPager 
 
      android:layout_width="match_parent" 
 
      android:layout_height="wrap_content" 
 
      android:id="@+id/viewPager" 
 
      ></android.support.v4.view.ViewPager> 
 

 

 
    </android.support.design.widget.AppBarLayout> 
 

 
</android.support.constraint.ConstraintLayout>

、ここでは私の最初ですホームと呼ばれる断片:

package ir.helpx.speedx; 
 

 

 
import android.os.Bundle; 
 
import android.support.v4.app.Fragment; 
 
import android.view.LayoutInflater; 
 
import android.view.View; 
 
import android.view.ViewGroup; 
 

 

 
/** 
 
* A simple {@link Fragment} subclass. 
 
*/ 
 
public class HUDFragment extends Fragment { 
 

 

 
    public HUDFragment() { 
 
     // Required empty public constructor 
 
    } 
 

 

 
    @Override 
 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
 
          Bundle savedInstanceState) { 
 
     // Inflate the layout for this fragment 
 
     return inflater.inflate(R.layout.fragment_hud, container, false); 
 
    } 
 

 
}

package ir.helpx.speedx; 
 

 

 
import android.location.Location; 
 
import android.location.LocationListener; 
 
import android.location.LocationManager; 
 
import android.os.Bundle; 
 
import android.support.v4.app.Fragment; 
 
import android.view.LayoutInflater; 
 
import android.view.View; 
 
import android.view.ViewGroup; 
 
import android.widget.TextView; 
 
import android.widget.Toast; 
 

 

 
/** 
 
* A simple {@link Fragment} subclass. 
 
*/ 
 
public class HomeFragment extends Fragment implements LocationListener{ 
 

 

 
    public HomeFragment() { 
 
     // Required empty public constructor 
 
    } 
 

 

 
    @Override 
 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
 
          Bundle savedInstanceState) { 
 
     // Inflate the layout for this fragment 
 
     LocationManager mgr; 
 
     mgr = (LocationManager)getContext().getSystemService(getActivity().LOCATION_SERVICE); 
 
     mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
 
     this.onLocationChanged(null); 
 
     return inflater.inflate(R.layout.fragment_home, container, false); 
 
    } 
 

 
    //TextView msg1; 
 

 
    @Override 
 
    public void onLocationChanged(Location location) { 
 

 
     if (location==null){ 
 
     TextView currentSpeed = null; 
 

 
     } 
 
     else { 
 
      float nCurrentSpeed = location.getSpeed(); 
 
      TextView currentSpeed = (TextView) getView().findViewById(R.id.speed); 
 
      currentSpeed.setText((int)nCurrentSpeed*18/5+""); 
 
      //msg1=currentSpeed; 
 
      Toast.makeText(getActivity(), "Location Found!", Toast.LENGTH_LONG).show(); 
 
     } 
 
    } 
 

 
    @Override 
 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
 

 
    } 
 

 
    @Override 
 
    public void onProviderEnabled(String provider) { 
 

 
    } 
 

 
    @Override 
 
    public void onProviderDisabled(String provider) { 
 

 
    } 
 
}
、ここで関連するXML

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
    xmlns:tools="http://schemas.android.com/tools" 
 
    android:layout_width="match_parent" 
 
    android:layout_height="match_parent" 
 
    tools:context="ir.helpx.speedx.HomeFragment"> 
 

 
    <!-- TODO: Update blank fragment layout --> 
 
    <TextView 
 
     android:layout_width="match_parent" 
 
     android:layout_height="match_parent" 
 
     android:text="@string/speed" 
 
     android:gravity="center" 
 
     android:textSize="180sp" 
 
     android:textStyle="bold" 
 
     android:textColor="@android:color/white" 
 
     android:id="@+id/speed"/> 
 

 
</FrameLayout>

、ここでは私の第2のフラグメントであります

断片の残りの部分は、私はツールバーのXMLを持って

に似ています:

、最終的には私の私のViewPagerAdapter:

package ir.helpx.speedx; 
 

 
import android.support.v4.app.Fragment; 
 
import android.support.v4.app.FragmentManager; 
 
import android.support.v4.app.FragmentPagerAdapter; 
 
import android.support.v4.view.ViewPager; 
 

 
import java.util.ArrayList; 
 

 
/** 
 
* Created by abe on 5/29/2017. 
 
*/ 
 

 
public class ViewPagerAdapter extends FragmentPagerAdapter { 
 

 
    ArrayList<Fragment> fragments = new ArrayList<>(); 
 
    ArrayList<String> tabTitles = new ArrayList<>(); 
 

 
    public void addFragments(Fragment fragments, String titles){ 
 
     this.fragments.add(fragments); 
 
     this.tabTitles.add(titles); 
 
    } 
 

 

 
    public ViewPagerAdapter(FragmentManager fm){ 
 
     super(fm); 
 
    } 
 

 
    @Override 
 
    public Fragment getItem(int position) { 
 
     return fragments.get(position); 
 
    } 
 

 
    @Override 
 
    public int getCount() { 
 
     return fragments.size(); 
 
    } 
 

 
    @Override 
 
    public CharSequence getPageTitle(int position) { 
 
     return tabTitles.get(position); 
 
    } 
 
}

私を助けてください!私のMainActivityに

viewPager.setOffscreenPageLimit(4);

を追加することによって、あなたは

+0

「クラッシュ」の説明を入力してください。それは何ですか、詳細です。 –

+0

3番目または4番目のフラグメントに行くとすぐにアプリケーションが終了します。これは、GPSが配置されているときに発生します。それ以外の場合(GPSが見つからない場合)はうまく動作します。 – abe

+0

----- viewPager.setOffscreenPageLimit(4);を追加することで問題を解決できると思います。私のMainActivityに----。 ViewPagerはデフォルトで、アイドル状態のビュー階層に1ページしか保持していないからだと私は思う。私が正しいことをしたことを教えてください! – abe

答えて

0

私はそれを修正することができると思い感謝しています。 ViewPagerはデフォルトで、アイドル状態のビュー階層に1ページしか保持していないからだと私は思う。私が正しいことをしたかどうか教えてください!

関連する問題