我有一个包含三个片段的活动,第一个是地图片段,另外两个是recyclerview片段。我试图直接在地图片段中请求权限,但它有一堆问题,我通过在父活动而不是地图片段中添加权限检查来修复。 现在,如果允许权限,它会转到我的位置并放大,如果不允许,则会转到自定义位置。但是,当我第一次安装应用程序时,它会在我启动它时立即加载碎片,之后我会被要求获得我的许可。
它有效,但 我想要的是仅在用户接受或拒绝 权限后加载我的片段,这是我第一次安装和启动我的应用。
我的主要活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
tutorialUsed = false;
tutorialPage = 1;
AppBarLayout.LayoutParams params =
(AppBarLayout.LayoutParams) toolbar.getLayoutParams();
params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
| AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
db = new SQLiteHandler(getApplicationContext());
// session manager
session = new SessionManager(getApplicationContext());
if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.ACCESS_FINE_LOCATION)) {
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{ android.Manifest.permission.ACCESS_FINE_LOCATION}, MY_LOCATION_REQUEST_CODE);
}
}
if (!session.isLoggedIn()) {
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
} else {
List<Restaurant> Restaurants = new ArrayList<>();
TabLayout tabLayout = findViewById(R.id.sliding_tabs);
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_one)));
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_two)));
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_three)));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_FIXED);
final ViewPager viewPager = findViewById(R.id.viewpager);
PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
viewPager.setOffscreenPageLimit(3);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
DrawerLayout drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View headView = navigationView.getHeaderView(0);
HashMap<String, String> user = db.getUserDetails();
String name = user.get("name");
FloatingActionButton selectDate = findViewById(R.id.fabSelectDate);
selectDate.setOnClickListener(v -> {
DialogFragment picker = new DatePickerFragment();
picker.show(getFragmentManager(), "datePicker");
});
TextView myUserName = headView.findViewById(R.id.idUsername);
myUserName.setText(name);
ColorGenerator generator = ColorGenerator.MATERIAL; // or use DEFAULT
// generate color based on a key (same key returns the same color), useful for list/grid views
int color = generator.getColor(user.get("uid"));
String firstLetter = name.substring(0, 1);
TextDrawable textDrawable = TextDrawable.builder().buildRound(firstLetter, color);
ImageView imageView = navigationView.getHeaderView(0).findViewById(R.id.profile_image_nav);
String myImage = user.get("image");
Picasso.with(this)
.load(AppConfig.URL_PROFILE_PHOTO + myImage)
.placeholder(textDrawable)
.error(textDrawable)
.transform(new CircleTransform())
.centerCrop()
.fit()
.into(imageView);
imageView.setOnClickListener(v -> {
Intent accountIntent = new Intent(MainActivity.this, MyProfileActivity.class);
startActivity(accountIntent);
});
myUserName.setOnClickListener(v -> {
Intent accountIntent = new Intent(MainActivity.this, MyProfileActivity.class);
startActivity(accountIntent);
});
}
}
答案 0 :(得分:0)
找到解决方案,也许其他人也可以使用它。
在我的片段中,我创建了一个刷新方法,再次称为餐馆标记:
public void ReloadMarkerFragment() {
mMap.clear();
if (!latitudeSetting.equals("") && !longitudeSetting.equals("")) {
latitude = Double.parseDouble(latitudeSetting);
longitude = Double.parseDouble(longitudeSetting);
}
setMarker(latitude, longitude, "", userName, "");
fetchAllrestaurants(userId);
}
在我的主要活动中,我引用了片段方法:
private void CallChildFragmentMethods(ViewPager viewPager, PagerAdapter adapter) {
MapsFragment mapsFragment = (MapsFragment) adapter.instantiateItem(viewPager, 0);
mapsFragment.ReloadMapsFragment();
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_LOCATION_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// phone permission is granted, call register and pass empty getMyPhoneNumber
// Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_SHORT).show();
CallChildFragmentMethods(viewPager, adapter);
} else {
// phone permission is not granted, call register and pass empty phone string
// Toast.makeText(getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show();
CallChildFragmentMethods(viewPager, adapter);
}
break;
}
}
因此,对于任何一个结果,我都会重新加载我的地图片段。
希望它有所帮助。