Загрузить фрагменты ПОСЛЕ проверки разрешений в родительском действии

У меня есть активность с тремя фрагментами, первый - это фрагмент карты, а два других - фрагменты 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);
        });
    }
}

person Banana    schedule 03.01.2018    source источник
comment
Добавьте PermissionCheck при создании MapFragment. Поэтому он сначала запрашивает permissions, а затем просто, если разрешения приняты, запускает MapFragment, а если отказано, ничего не делает.   -  person Aditya    schedule 03.01.2018
comment
@ Heisen-Berg Я уже пытался добавить его во фрагмент своей карты, но у меня было куча проблем, и ответ, который я нашел, заключался в том, чтобы переместить его в родительскую активность.   -  person Banana    schedule 03.01.2018
comment
с какими проблемами вы сталкиваетесь в mapfragment?   -  person Tejas Pandya    schedule 03.01.2018
comment
@Tej Это и Это. И лучший ответ, который я нашел, заключался в том, что это ошибка Android, и решение состоит в том, чтобы переместить ее в родительскую активность.   -  person Banana    schedule 03.01.2018
comment
Я не уверен в этой идее, но вы можете попробовать. в вашем фрагменте карты. перед setContentView .спросите разрешение, если пользователь принимает набор, чем ваш xml, и делайте это, как обычно, в противном случае снова спросите разрешение   -  person Tejas Pandya    schedule 03.01.2018
comment
@Tej Я попробую это сегодня и дам тебе знать, если это сработает.   -  person Banana    schedule 03.01.2018
comment
я не говорю, что это правильный подход, но для вашей проблемы это может быть обходным путем для вас.   -  person Tejas Pandya    schedule 03.01.2018
comment
Давайте продолжим обсуждение в чате.   -  person Banana    schedule 03.01.2018
comment
@Tej Пробовал это, но не смог заставить это работать...   -  person Banana    schedule 03.01.2018


Ответы (1)


Нашел решение, так что, может быть, кто-то еще сможет использовать это.

В своем фрагменте я создал метод обновления, снова назвав маркеры ресторана:

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

Таким образом, для любого результата я получаю перезагрузку фрагмента моей карты.

Надеюсь, это поможет кому-то.

person Banana    schedule 22.03.2018