【问题标题】:Show snackbar after popping fragment backstack弹出片段回栈后显示小吃栏
【发布时间】:2016-07-18 09:44:56
【问题描述】:

我试图在一个片段中执行一个动作,然后移动到前一个片段并显示一个带有消息的小吃栏,确认第一个片段中的动作。但是,我正在第一个片段(我要从中移动的片段)中创建并显示小吃栏,并且小吃栏没有出现在我要更改的片段中,可能是因为它显示在我要移动的片段中来自。

我正在执行警报对话框中的代码:

builder.setPositiveButton(positiveText, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dbHandler.deleteExercise(exercise.getId());

                    // Making the snackbar here did not work, either.

                    getFragmentManager().popBackStack();

                    Snackbar snack = Snackbar.make(mainLayout, "Exercise deleted", Snackbar.LENGTH_SHORT);
                    snack.show();
                }
            });

知道如何实现这一目标吗?

谢谢!

编辑:

我制作了这张非常粗略的流程图,以更清楚地说明我想要实现的目标。

【问题讨论】:

  • 希望您在切换时显示Snack Bar 在之前的片段中?
  • @jaydroider 是的,流程是这样的: 从项目列表中选择项目(列表是“上一个片段”)--> 获取所选项目的详细视图(“当前片段” )。单击以删除项目 --> 返回项目列表(“上一个片段”)并显示一个快餐栏。这有意义吗?
  • 基本上你要做的是在片段之间传递数据,这将表明删除。您可以使用这些答案来做到这一点 stackoverflow.com/questions/5194548/… 。一般的想法是你使用活动作为两个片段之间的接口。还有其他方法,例如使用 roboguice 和 otto 库。所有这些都在答案中详细说明

标签: android


【解决方案1】:

我最终通过主Activity 实现Fragments 之间的消息传递,并在片段的onResume() 方法中检查消息:

MainActivity:

private String fragmentTransactionMessage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // Snip

        // Initialize fragment transaction message
        fragmentTransactionMessage = null;

        // Snip
    }

    // Three methods used to send information (text) between fragments
    public void setFragmentTransactionMessage(String message) {
        this.fragmentTransactionMessage = message;
    }

    public String getFragmentTransactionMessage() {
        return fragmentTransactionMessage;
    }

    public void resetFragmentTransactionMessage() {
        this.fragmentTransactionMessage = null;
    }

片段 2:

// Remove exercise from database
dbHandler.deleteExercise(exercise.getId());

// Update message in main activity
((MainActivity)getActivity()).setFragmentTransactionMessage("Item deleted");

// Move to previous fragment
getFragmentManager().popBackStack();

片段 1:

@Override
public void onResume() {
    super.onResume();

    // Check for messages in main activity
    String message = ((MainActivity)getActivity()).getFragmentTransactionMessage();

    // If any, display as snackbar
    if(message != null) {
        Snackbar snack = Snackbar.make(mainLayout, message, Snackbar.LENGTH_SHORT);
        snack.show();

        // Reset message in activity
        ((MainActivity)getActivity()).resetFragmentTransactionMessage();
    }
}

【讨论】:

    【解决方案2】:

    另一个建议是将 getFragmentManager().popBackStack(); 包装在一个方法中,该方法采用一个 Runnable Obj,它将在选定的延迟后运行

    例如:

    public void goBack(Runnable runAfterBack, long delay) {
        mFragmentActivity.onBackPressed();
        if (runAfterBack != null) { 
        (new Handler(Looper.getMainLooper())).postDelayed(runAfterBack, delay);
         }
       }
    

    用法:

    goBack(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(mActivity, "STRING", Toast.LENGTH_SHORT).show();}
            }, 1500);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多