在父活动中权限检查后加载片段

时间:2018-01-03 09:44:41

标签: java android android-fragments android-tablayout runtime-permissions

我有一个包含三个片段的活动,第一个是地图片段,另外两个是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);
        });
    }
}

1 个答案:

答案 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;
    }
}

因此,对于任何一个结果,我都会重新加载我的地​​图片段。

希望它有所帮助。