Android 控制片段内的后退按钮

Android 控制片段内的后退按钮,android,android-fragments,Android,Android Fragments,我有编程经验,但在安卓方面没有太多经验。 我认为,在任何平台上,我们都不能允许用户不经许可就离开屏幕 数据已保存。在保存之前,我们还必须确保数据是正确的 在Android中,我找不到一种有效的方法来使用片段实现这个场景 让我们考虑一个包含1个活动的应用程序A1,它控制3个片段F1、F2和F3。 F1和F2可通过NavigationDrawer访问 当用户想要在数据库中输入数据时,F2调用F3。 F3有多个EditText和其他视图,因此在不发出警报的情况下离开F3不是一个好主意 用户担心他可能会

我有编程经验,但在安卓方面没有太多经验。 我认为,在任何平台上,我们都不能允许用户不经许可就离开屏幕 数据已保存。在保存之前,我们还必须确保数据是正确的

在Android中,我找不到一种有效的方法来使用片段实现这个场景

让我们考虑一个包含1个活动的应用程序A1,它控制3个片段F1、F2和F3。 F1和F2可通过NavigationDrawer访问

当用户想要在数据库中输入数据时,F2调用F3。 F3有多个EditText和其他视图,因此在不发出警报的情况下离开F3不是一个好主意 用户担心他可能会失去一切

工具栏中有一个菜单项,允许用户保存数据并返回F2

我想控制后退按钮,以防止用户忘记保存数据 或者,如果您有任何信息错误,我有办法向用户发送消息(Toast) 数据

只使用活动可以做到这一点,但这不是一个解决方案,因为我使用的是NavigationDrawer

据我所知,onBackPressed是一个活动回调,不会被片段截获

简言之:

我希望留在片段F3中,直到用户纠正所有错误并保存数据。万一 他/她点击后退按钮而不保存,将向他/她发送一个警报对话框

有人做过那样的事吗?在Android中实现数据一致性的最佳实践是什么


提前感谢您的帮助。

您可以试试这个。在活动中,您可以检查当前显示的片段。如果它是你想要的,做你想要的行动

在你的活动中放

@Override
public void onBackPressed() {
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);

   if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
      //Do what you want

   return;
   }
   //Otherwise, react normally
   super.onBackPressed();
}
您还可以尝试将其添加到片段中。它只是简单地添加一个keylistener

getView().setOnKeyListener( new OnKeyListener()
{
    @Override
    public boolean onKey( View v, int keyCode, KeyEvent event )
    {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            return true;
        }
        return false;
    }
} );

让我知道这是否有效

你可以试试这个。在活动中,您可以检查当前显示的片段。如果它是你想要的,做你想要的行动

在你的活动中放

@Override
public void onBackPressed() {
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);

   if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
      //Do what you want

   return;
   }
   //Otherwise, react normally
   super.onBackPressed();
}
您还可以尝试将其添加到片段中。它只是简单地添加一个keylistener

getView().setOnKeyListener( new OnKeyListener()
{
    @Override
    public boolean onKey( View v, int keyCode, KeyEvent event )
    {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            return true;
        }
        return false;
    }
} );
让我知道这是否有效

当用户想要在数据库中输入数据时,F2调用F3。 F3有几个EditText和其他视图,所以这不是一个好主意 在不提醒用户可能丢失信息的情况下离开F3的想法 一切

您是否考虑过备份您的
片段
onPause()
(或
onDestroy()
甚至)中的任何数据?然后,您可以将任何信息存储在
EditText
(可能是存储到
SharedReferences
)中,然后在
片段被销毁后重新启动时将其还原

除此之外,您还可以创建一个
界面
(即
BackPressObserver
),并让您想要对backpress做出反应的任何
片段
实现它

public interface BackPressObserver {

    boolean isReadyToInterceptBackPress();
    void onBackPress();

}
片段一

public class FragmentOne extends Fragment implements BackPressObserver {

    @Override
    public boolean isReadyToInterceptBackPress() {
        return this.isVisible() && 
            //**Another condition, i.e. !editText.getText().toString().isEmpty();**
    }

    @Override
    public void onBackPress() {
        //Do whatever needs to be done on a back press. When finished, make sure isReadyToInterceptBackPress() will return false.
    }

}
活动

public class MainActivity extends AppCompatActivity {

    @Override 
    public void onBackPressed() {

        for (Fragment fragment : getSupportFragmentManager().getFragments()) {
            if (fragment instanceof BackPressObserver) {
                BackPressObserver observer = (BackPressObserver) fragment;
                if (observer.isReadyToInterceptBackPress()) {
                    observer.onBackPress();
                    return;
                }
            }
        }

        super.onBackPressed();

    }

}
当用户想要在数据库中输入数据时,F2调用F3。 F3有几个EditText和其他视图,所以这不是一个好主意 在不提醒用户可能丢失信息的情况下离开F3的想法 一切

您是否考虑过备份您的
片段
onPause()
(或
onDestroy()
甚至)中的任何数据?然后,您可以将任何信息存储在
EditText
(可能是存储到
SharedReferences
)中,然后在
片段被销毁后重新启动时将其还原

除此之外,您还可以创建一个
界面
(即
BackPressObserver
),并让您想要对backpress做出反应的任何
片段
实现它

public interface BackPressObserver {

    boolean isReadyToInterceptBackPress();
    void onBackPress();

}
片段一

public class FragmentOne extends Fragment implements BackPressObserver {

    @Override
    public boolean isReadyToInterceptBackPress() {
        return this.isVisible() && 
            //**Another condition, i.e. !editText.getText().toString().isEmpty();**
    }

    @Override
    public void onBackPress() {
        //Do whatever needs to be done on a back press. When finished, make sure isReadyToInterceptBackPress() will return false.
    }

}
活动

public class MainActivity extends AppCompatActivity {

    @Override 
    public void onBackPressed() {

        for (Fragment fragment : getSupportFragmentManager().getFragments()) {
            if (fragment instanceof BackPressObserver) {
                BackPressObserver observer = (BackPressObserver) fragment;
                if (observer.isReadyToInterceptBackPress()) {
                    observer.onBackPress();
                    return;
                }
            }
        }

        super.onBackPressed();

    }

}

最佳实践是在用户离开该屏幕时保存数据,无论数据是否通过验证。这可能意味着您必须以特殊方式将其保存为不完整的表单或记录

然后,给用户一个按钮(例如“完成”操作按钮),以最终确认表单条目是否完成。此时验证数据。如果您不这样做,并且按照您的建议删除不完整的数据,用户将无法切换到其他应用程序来查找他们可能需要在表单中输入的数据

Gmail应用程序就是一个很好的例子。如果您正在撰写电子邮件并离开该屏幕(例如查看其他数据),它不会警告您将丢失数据,它只是将您的电子邮件保存为草稿。即使您的电子邮件缺少必需数据(收件人地址),也会发生这种情况。您可以来回切换任意次数,直到电子邮件完成

您不需要专门挂起“后退”按钮来执行此操作:您只需将数据保存在
onPause
中,并且可能
Toast
用户可以向他们保证您已经完成了操作。“提交”数据(发送电子邮件或应用表单更改)应删除草稿数据,这只是一个普通按钮
onClick


自从安卓开发者网站上的“设计”页面变成了“材料设计”,他们似乎不再有自己的用户体验技巧,但是。我还发现。

最佳实践是在用户离开该屏幕时保存数据,无论数据是否通过验证。这可能意味着您必须以特殊方式将其保存为不完整的表单或记录

然后,给用户一个按钮(例如“完成”操作按钮),以最终确认表单条目是否完成。此时验证数据。如果您不这样做,并且按照您的建议删除不完整的数据,用户将无法切换到其他应用程序来查找他们可能需要在表单中输入的数据

Gmail应用程序就是一个很好的例子。如果您正在撰写电子邮件,并离开该屏幕(例如到厕所