在这个例子中,我在片段中实现了谷歌地图。这个应用程序还有一个导航抽屉。在导航抽屉中有一个列表视图,用作应用程序的菜单。菜单项是" map"和"片段1"。当我选择" map"从导航抽屉中,屏幕冻结两秒钟,然后导航抽屉滑回并加载地图。这对用户体验不利。在这种情况下,有什么方法可以阻止应用程序冻结吗?一种允许导航抽屉正常运行并指示用户地图仍在加载的方法?这是代码:
MainActivity.java
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private DrawerLayout drawerLayout;
private FrameLayout framlaout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.initComponents();
}
public void initComponents(){
toolbar = (Toolbar) findViewById(R.id.toolBar);
drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
framlaout = (FrameLayout) findViewById(R.id.container);
toolbar.setTitle("example");
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
NavigationFragment navigationFragment = (NavigationFragment) getSupportFragmentManager()
.findFragmentById(R.id.navigation_fragment);
navigationFragment.setupNavigationProperty(R.id.navigation_fragment,drawerLayout,toolbar);
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.container,new BlankFragment()).commit();
}
MapFragment.java
public class MapFragment extends Fragment implements OnMapReadyCallback {
private GoogleMap mMap;
public MapFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_map, container, false);
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
return view;
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
}
NavigationFragment.java
public class NavigationFragment extends Fragment {
private ListView listView;
private ArrayList<String> menuItems;
private View containerView;
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle drawerToggle;
public NavigationFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_navigation, container, false);
initComponents(view);
onClickItemnListnener();
return view;
}
public void initComponents(View view){
menuItems = new ArrayList<>();
menuItems.add("Fragment 1");
menuItems.add("map");
listView = (ListView) view.findViewById(R.id.menu);
listView.setAdapter(new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1,menuItems));
}
public void setupNavigationProperty(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar){
containerView = getActivity().findViewById(fragmentId);
this.drawerLayout = drawerLayout;
drawerToggle = new ActionBarDrawerToggle(getActivity(),drawerLayout,toolbar
,R.string.drawer_open,R.string.drawer_close);
drawerLayout.addDrawerListener(drawerToggle);
drawerLayout.post(new Runnable() {
@Override
public void run() {
drawerToggle.syncState();
}
});
}
public void onClickItemnListnener(){
final FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (menuItems.get(position)){
case "Fragment 1":
fragmentManager.beginTransaction().replace(R.id.container,new BlankFragment()).commit();
closeNavigationDrawer(drawerLayout,containerView);
break;
case "map":
fragmentManager.beginTransaction().replace(R.id.container,new MapFragment()).commit();
closeNavigationDrawer(drawerLayout,containerView);
break;
}
}
});
}
public void closeNavigationDrawer(DrawerLayout layout,View fragmentView){
drawerLayout = layout;
drawerLayout.closeDrawer(containerView);
}
&#34;片段1&#34;是一个空片段。
我做了类似的事情但结果相同。
final SupportMapFragment[] mapFragment = new SupportMapFragment[1];
Runnable runnable = new Runnable() {
@Override
public void run() {
mapFragment[0] = (SupportMapFragment) getChildFragmentManager()
.findFragmentById(R.id.map);
}
};
try {
Thread thread = new Thread(runnable);
thread.start();
thread.join();
mapFragment[0].getMapAsync(MapFragment.this);
} catch (InterruptedException e) {
e.printStackTrace();
}
答案 0 :(得分:-2)
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private DrawerLayout drawerLayout;
private FrameLayout framlaout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.initComponents();
}
public void initComponents(){
toolbar = (Toolbar) findViewById(R.id.toolBar);
drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
framlaout = (FrameLayout) findViewById(R.id.container);
toolbar.setTitle("example");
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
NavigationFragment navigationFragment = (NavigationFragment) getSupportFragmentManager()
.findFragmentById(R.id.navigation_fragment);
navigationFragment.setupNavigationProperty(R.id.navigation_fragment,drawerLayout,toolbar);
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.container,new BlankFragment()).commit();
}
MapFragment.java
答案 1 :(得分:-2)
您应该直接使用MapView类,而不是使用SupportMapFragment。不幸的是,即使谷歌调用加载地图“asynch”它实际上在UI线程中运行,这就是导致冻结的原因。
帮助我的是在第一次启动应用程序时在后台线程中运行它,它基本上预加载了mapview:
Runnable initMap = new Runnable() {
@Override
public void run() {
MapView mapView = new MapView(YourActivity.this);
mapView.onCreate(null);
}
};
new Thread(initMap).start();