是否有一种方法,我们可以实现onBackPressed()在Android片段类似的方式,我们实现在Android活动?
因为Fragment的生命周期没有onBackPressed()。在android3.0片段中是否有其他替代方法来覆盖onBackPressed() ?
是否有一种方法,我们可以实现onBackPressed()在Android片段类似的方式,我们实现在Android活动?
因为Fragment的生命周期没有onBackPressed()。在android3.0片段中是否有其他替代方法来覆盖onBackPressed() ?
当前回答
你可以像这样使用父活动的onBackPressedDispatcher:
val backpress = requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, true) {
// here dispatcher works for any action when back pressed
}
你也可以从fragment中启用/禁用backpress按钮,如下所示:
backpress.isEnabled = true/false
其他回答
如果你需要在Fragment中实现,你应该使用接口。
另一方面,如果你需要在活动中实现,如eg。执行一个简单的finish()活动,执行以下操作:
YourActivity.kt
override fun onBackPressed() {
Log.d(this.javaClass.simpleName, "onBackPressed() called")
if (supportFragmentManager.fragments.any { it is YourFragment }) {
finish()
return
}
}
以下是我对这个问题的解决方案:
活动A:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE)
{
if(resultCode == Activity.RESULT_OK)
{
tvTitle.setText(data.getExtras().getString("title", ""));
}
}
}
活动B:
@Override
public void onBackPressed()
{
setResult(Activity.RESULT_OK, getIntent());
super.onBackPressed();
}
活动b保存片段。
在片段:
private void setText(String text)
{
Intent intent = new Intent();
intent.putExtra("title", text);
getActivity().setIntent(intent);
}
通过这种方式,活动A中的意图对象“data”将从片段中获取字符串
像这样执行 Fragment_1 -> Fragment_2 -> Fragment_3
Button btn = (Button) rootView.findViewById(R.id.your_button_id);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Fragment_2 nextFrag= new Fragment_2();
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.content_frame, nextFrag,getTag())
.addToBackStack(null)
.commit();
}
});
Fragment_3 -> Fragment_2 -> Fragment_1
Step_1:在Base Activity中创建一个可公开访问的字符串
step2:每当一个新的Fragment被激活时,在Base Activity中改变String的值
Step_3:然后添加onBackPressed()方法,并将字符串值传递给另一个方法,其中fagments可以被替换
在基础活动中
public static String currentFragment=null;
@Override
public void onBackPressed()
{
displayPreviousFragment(currentFragment);
}
public void displayPreviousFragment(String currentFragment)
{
//creating fragment object
Fragment fragment = null;
//initializing the fragment object which is selected
switch (currentFragment)
{
case "Fragment_2" : fragment = new Fargment_1(); break;
case "Fragment_3" : fragment = new Fragment_2(); break;
}
//replacing the fragment
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.frame_to_replace_fragment, fragment);
ft.commit();
}
}
在Fragment_2 在OnCreateView方法内
BaseActivity.currentFragment="Fragment_2";
在Fragment_3 在OnCreateView方法内
BaseActivity.currentFragment="Fragment_3";
通过处理onBackPressed提供自定义反向导航现在更容易在片段内进行回调。
class MyFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (true == conditionForCustomAction) {
myCustomActionHere()
} else NavHostFragment.findNavController(this@MyFragment).navigateUp();
}
}
requireActivity().onBackPressedDispatcher.addCallback(
this, onBackPressedCallback
)
...
}
如果你想要基于某些条件的默认后退动作,你可以使用:
NavHostFragment.findNavController(this@MyFragment).navigateUp();
这些都不容易实现,也不会以最佳方式发挥作用。
片段有一个方法调用onDetach来完成这项工作。
@Override
public void onDetach() {
super.onDetach();
PUT YOUR CODE HERE
}
这个就行了。