大家好,
我在“ 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位置并在该位置邀请片段。
答案 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)
您是从第二个片段还是从活动请求许可?如果从片段中请求,它将保留在片段中。