2017-05-31 50 views
0

我在我的应用程序中有四个片段。第一个获得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.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>

,这里是我的第二个片段:

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

 
}

休息的片段类似于

我有一个工具栏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); 
 
    } 
 
}

请帮助我!谢谢

+0

请提供一个'崩溃'的解释,它是什么,更多的细节。 –

+0

只要我转到第三个或第四个片段,应用程序就会关闭。这发生在GPS定位时。否则(当GPS不在位)它工作得很好。 – abe

+0

我想我可以通过添加----- viewPager.setOffscreenPageLimit(4)来修复它; ----我的MainActivity。我认为这是因为默认情况下,ViewPager在空闲状态下仅保留视图层次结构中的一个页面。请告诉我做了正确的事! – abe

回答

0

我想我可以修复它通过添加

viewPager.setOffscreenPageLimit(4);

我的MainActivity。我认为这是因为默认情况下,ViewPager在空闲状态下仅保留视图层次结构中的一个页面。请告诉我,如果我做对了!

相关问题