【发布时间】:2018-06-12 23:26:30
【问题描述】:
我有一个activity,有3个fragment,第一个是map fragment,另外两个是recyclerview fragment。我尝试直接在地图片段中请求权限,但它有很多问题,我通过在父活动而不是地图片段中添加权限检查来解决这些问题。 现在,如果允许,它会转到我的位置并放大,如果不是,它会转到自定义位置。但是当我第一次安装应用程序时,它会在我启动它时立即加载片段,之后我会被要求获得我的许可。
它可以工作,但我想要的是仅在用户接受或拒绝权限后加载我的片段,在我第一次安装和启动我的应用程序时.
我的主要活动:
@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);
});
}
}
【问题讨论】:
-
在创建
MapFragment时添加PermissionCheck。所以它首先询问permissions,然后简单地询问是否接受了权限开始MapFragment,如果拒绝它什么也不做。 -
@Heisen-Berg 我已经尝试将它添加到我的地图片段中,但遇到了很多问题,我找到的答案是将其移动到父活动中
-
您在 mapfragment 中遇到了什么样的问题?
-
我并不是说这是一种正确的方法,但是对于您的问题,这可能对您有用..
标签: java android android-fragments android-tablayout runtime-permissions