控制片段内的后退按钮

时间:2016-01-27 16:56:59

标签: android android-fragments

我有编程经验,但在Android中并不多。 我认为,在任何平台上,我们都不允许用户离开屏幕 数据已保存。在保存之前,我们还必须确保数据正确无误。

在Android中,我找不到使用Fragments

实现此方案的有效方法

让我们考虑一个包含1个名为A1的活动的应用程序,它控制3个片段F1,F2和F3。

通过NavigationDrawer访问F1和F2。

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

在工具栏中有一个菜单项,可让用户保存数据并返回F2。

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

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

据我所知,onBackPressed是一个Activity回调,并没有被Fragment截获。

简而言之:

我想留在片段F3,直到用户纠正所有错误并保存数据。的情况下 他/她点击后退按钮而不保存,会向他/她发送AlertDialog。

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

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

由于Android Developer网站上的“设计”页面转向了“Material Design”,他们似乎不再拥有他们的UX技巧,而是"Never lose my stuff" used to be one of the key principles。我还找到了the Gmail example in the WayBackMachine's archive of the design pages

答案 1 :(得分:2)

  

当用户想要在数据库中输入数据时,F2调用F3。   F3有几个EditTexts和其他视图,所以这不是一个好的   想要离开F3而不提醒用户他可能输了   一切。

您是否考虑过备份onPause() onDestroy()(或Fragment偶数)内的所有数据?然后,您可以将任何信息存储在EditText(可能是SharedPreferences)中,然后在Fragment重新启动时将其恢复(如果已销毁)。

除此之外,您可以创建一个interface(即BackPressObserver)并让任何Fragment您想要对其进行反应来实现它。

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();

    }

}

答案 2 :(得分:1)

你可以试试这个。在您的活动中,您可以检查当前显示的片段。如果它是您想要的那个,请执行您的预期操作。

在你的活动里面放

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

让我知道这是否有效!