Android运行时权限在接受或拒绝权限后调用相同的Fragment

时间:2019-03-26 12:11:35

标签: android android-fragments android-permissions android-dialogfragment

大家好,

我在“ BottomNavigationView”组件上有活动,在这个组件中,我有四个片段。例如,当我单击第二个片段并单击“授予权限”按钮时,将弹出用于读写外部存储的运行时权限。

当我接受或拒绝运行时权限应用程序时,会自动回调MainActivity并默认显示第一个片段(因为第一个片段是Main Activitiy中的默认片段)。

在接受或拒绝停留在第二个片段之后,是否可能?或者,例如,我需要保存在片段的sharedpreference位置并在该位置邀请片段。

我尝试使用lib https://github.com/googlesamples/easypermissions。成功失败后,我尝试使用自定义实现进行许可。

这是我的代码。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <PackageId>TradeStore.Model</PackageId>
    <ProtoIncludes>.;../../proto</ProtoIncludes>
    <OutputType>Library</OutputType>
    <TargetFramework>netstandard2.0</TargetFramework>
    <Protobuf_NoWarnMissingExpected>true</Protobuf_NoWarnMissingExpected>
  </PropertyGroup>  

  <ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.6.1" />    
    <PackageReference Include="Grpc" Version="1.19.0" />
    <PackageReference Include="Grpc.Tools" Version="1.19.0" PrivateAssets="All" />
  </ItemGroup>

  <ItemGroup>
    <FilesToDelete Include="%(RelativePath)generated-proto-output/*.cs" />
  </ItemGroup>

  <Target Name="DeleteSpecificFiles" BeforeTargets="Build">    
    <Message Text="Specific Files: @(FilesToDelete)"/>
    <Message Text ="Beginning to delete specific files before build or rebuild..."/>
    <Delete Files="@(FilesToDelete)"/>
  </Target>

    <ItemGroup>    
      <Protobuf Include="../../proto/**/*.proto" ProtoRoot="../../proto/" OutputDir="%(RelativePath)generated-proto-output/" GrpcServices="None" />
      <Protobuf Update="../../proto/**/*Service.proto" GrpcServices="Both" />
    </ItemGroup>

</Project>

在接受或拒绝停留在第二个片段之后,是否可能?或者,例如,我需要保存在片段的sharedpreference位置并在该位置邀请片段。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,因为活动正在重新创建,所以发生了。 您必须使用onSaveInstanceState方法从BottomNavigationView中保存选定的项目ID,如下所示:

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt(KEY_BOT_NAV_VIEW_SELECTED_ITEM_ID, mBottomNavigationView.getSelectedItemId());
    super.onSaveInstanceState(outState);
}

其中KEY_BOT_NAV_VIEW_SELECTED_ITEM_ID是用于保存和检索ID的字符串键。然后,在此之后,再次创建您的活动并调用protected void onCreate(Bundle savedInstanceState)时,bundle参数不为null,您可以检索保存的id:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mBottomNavigationView.setOnNavigationItemSelectedListener(this);
    if (savedInstanceState != null) {
        restoreInstanceState(savedInstanceState);
    } else {
        //show first fragment fragment 
    }
}

您可以从here

了解更多有关保存和恢复状态的信息。

答案 1 :(得分:0)

您是从第二个片段还是从活动请求许可?如果从片段中请求,它将保留在片段中。