【问题标题】:In fragment I want to click back how to show alert dialog在片段中我想点击返回如何显示警报对话框
【发布时间】:2018-02-28 10:52:23
【问题描述】:

我在 Activity 中使用导航菜单。当我单击菜单时,它会转到我给addtobackstack(null) 的特定片段。我想解决这两个问题:

  1. 我想通过弹窗显示do you want to exit app 在后面的片段中
  2. 假设我从 Fragment A 遍历到 B,然后从 B 遍历到 C。如果我在 Fragment C 中返回,我想进入主页,而不显示 Fragment B。

这是我的家庭活动:

package school.wyse.app.activities;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;


public class ParentHomeActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
    ServerUtils servutil;
    GridLayoutManager grid;
    Toolbar toolbar;
    private View navHeader;
    LinearLayout profile;
    ImageView msglist;
    ArrayList<StudentProfile> lang_list_new;
    public RecyclerView studentsListRecyclerView;
     public ParentMenuDashoard mStudAdapter;
    StudentProfile[] profiles;
    private StudentProfile[] studentCachedData;
    Context ctx;
   DrawerLayout drawer;
    ImageView imageViewstaff;

    String tenent_id,profilename,image,userphone;

    Integer id,roleid;
    String backStateName;
    TextView profile_phone,profile_name;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            setContentView(R.layout.activity_parent_home);
           backStateName = this.getClass().getName();
            ctx=this;
         Toast.makeText(ctx, "backStateName--"+backStateName, Toast.LENGTH_SHORT).show();
            toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                    this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
            drawer.setDrawerListener(toggle);
            toggle.syncState();

            NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
            navigationView.setNavigationItemSelectedListener(this);
            navHeader=navigationView.getHeaderView(0);
            studentsListRecyclerView = (RecyclerView) navHeader.findViewById(R.id.messageWindowRecycler);


            ParentDashboard parentDashboard = new ParentDashboard();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.content_frame, parentDashboard, parentDashboard.getTag()).commit();
            toolbar.setTitle("Dashboard");

        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    @Override
    public void onBackPressed() {
        try {

          DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            if (drawer.isDrawerOpen(GravityCompat.START)) {
                drawer.closeDrawer(GravityCompat.START);
            } else {


                super.onBackPressed();
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.home, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
  /*  if (id == R.id.action_msg) {
            return true;
        }*/

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_dashboard) {
            ParentDashboard parentDashboard = new ParentDashboard();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.content_frame, parentDashboard, parentDashboard.getTag()).addToBackStack(null).commit();
            //toolbar.setTitle("Dashboard");

        } else if (id == R.id.nav_teachers) {
            TeacherList teacherList = new TeacherList();
            FragmentManager manager = getSupportFragmentManager();

          //  manager.beginTransaction().replace(R.id.id_content_frame, accountsMenuListFragment, "AccountsMenu").addToBackStack(" ").commit();
            manager.beginTransaction().replace(R.id.content_frame, teacherList, teacherList.getTag()).addToBackStack(null).commit();
          //  toolbar.setTitle("Teachers");

        } else if (id == R.id.nav_attendance) {
            AttendanceFragment attendanceFragment = new AttendanceFragment();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.content_frame, attendanceFragment, attendanceFragment.getTag()).addToBackStack(null).commit();
           // toolbar.setTitle("Attendance");

        } else if (id == R.id.nav_consumablity) {
            ParentConsumablityFragment parentConsumablityFragment = new ParentConsumablityFragment();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.content_frame, parentConsumablityFragment, parentConsumablityFragment.getTag()).addToBackStack(null).commit();
            // toolbar.setTitle("Attendance");

        }
        else {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }



}

【问题讨论】:

  • 首先请用switch代替if elsecry
  • 其次,您可以在您的活动addremove 中保留一个ArrayList&lt;Fragment&gt; 和两个公共方法,当您添加或删除片段时,它们将被调用。在onBackPressed 中只检查数组是否为空(在这种情况下关闭应用程序)否则,删除子项(从数组中的项目)
  • 能否请您将示例代码发给我

标签: android android-fragments fragment-backstack


【解决方案1】:

好的,抱歉回复晚了

这部分进入您的活动的onBackPressed(),主要检查您是否附加了片段(因此它不会执行本机返回,从而关闭应用程序)

if (childFragments.size() > 0) {
        if (childFragments.get((childFragments.size() - 1)) != null) {
            childFragments.remove(childFragments.size() - 1);
            return;
        }
    }

你所要做的就是每次attach / detach碎片时add/remove这个数组的项目:)

对于您在片段 C 上并且想要返回片段 A 而不显示片段 B 的特殊情况,我建议您创建一个公共函数,从 ArrayList 中删除所有片段,除了最后一个片段(从位置 0 开始)

【讨论】:

    【解决方案2】:
    1. 在要显示 appexit 的 mainactivity 中使用以下代码:

           @Override
      public void onBackPressed() {
      
      if (doubleBackToExitPressedOnce) {
          super.onBackPressed();
          finish();
          return;
      }
      this.doubleBackToExitPressedOnce = true;
      Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
      
      new Handler().postDelayed(new Runnable() {
      
          @Override
          public void run() {
              doubleBackToExitPressedOnce = false;
          }
      }, 2000);
      

      }

    2. 将片段 A 移动到 B 时,不要添加“addbackstack”。将片段 B 移动到 C 时添加 "addbackstack("C")"

    【讨论】:

      【解决方案3】:

      首先,您必须注意第二个问题,因为这将导致第一个问题的处理很容易,因此您必须注意如何启动片段,以便始终到达第一个片段,而无论导致当前片段的片段流如何都进行回击,为此,只需启动片段,如下所示:

      /**
       * To initiate any fragment
       */
      private void showAnyFragment(Fragment fragmentToShow) {
          getSupportFragmentManager().popBackStack();
          FrameLayout frameLayout = (FrameLayout) findViewById(R.id.content);
          frameLayout.setVisibility(View.VISIBLE);
      
          getSupportFragmentManager().beginTransaction()
                  .replace(R.id.content, fragmentToShow)
                  .addToBackStack(null)
                  .commit();
      }
      
      /**
       * When (for a reason) you want to initiate the main fragment (FragmentA)
       */
      private void homeClicked() {
          getSupportFragmentManager().popBackStack();
      }
      

      现在,fragmentA 是您的主要片段,当从 ABCD 并单击返回按钮时,它将直接返回到 A

      谈到你的第二个问题,这将是直截了当的,因为你已经只保留了fragmentA 始终在后堆栈中,因此除非没有除@987654330 之外的其他片段,否则不会调用 Activity 的 onBackPressed() 函数@正在显示(例如,如果您在fragmentC中并且您单击返回按钮,则不会调用onBackPressed()函数),因此您可以确定当您进入当前正在运行的活动的onBackPressed()函数时片段是FragmentA,这是您的主页片段。

      因此,如果您想在用户尝试退出应用程序时显示弹出窗口(他将在 FragmentA 中并返回),您所要做的就是覆盖 MainActivityonBackPressed() 方法保存碎片:

      @Override
      public void onBackPressed() {
        // the user here is in FragmentA(main page),
                and he is clicking back to exit the app.
        // TODO show popup here or do whatever you want
      }
      

      【讨论】:

        猜你喜欢
        • 2023-02-10
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        相关资源
        最近更新 更多