【问题标题】:Go back from a fragment to main fragment从一个片段返回到主片段
【发布时间】:2020-03-28 06:18:50
【问题描述】:

这是我调用片段的主要活动:

public class what extends AppCompatActivity {

    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mToggle;


    private ListView mDrawerList;
    private ArrayAdapter<String> mAdapter;
    private FragmentTransaction fragmentTransaction;
    NavigationView navigationView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_what);


        mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
        mToggle=new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open, R.string.close);
        mDrawerLayout.addDrawerListener(mToggle);
        mToggle.syncState();

        fragmentTransaction= getSupportFragmentManager().beginTransaction();


        fragmentTransaction.add(R.id.main_content,new mainfrag());
        fragmentTransaction.commit();

        ActionBar actionBar= getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

        navigationView=(NavigationView)findViewById(R.id.nav_view);
        navigationView.getMenu().getItem(1).setChecked(false);
        navigationView.getMenu().getItem(0).setChecked(true);
        navigationView.getMenu().getItem(2).setChecked(false);
        navigationView.getMenu().getItem(3).setChecked(false);


        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.nav_main:
                        navigationView.getMenu().getItem(1).setChecked(false);
                        navigationView.getMenu().getItem(2).setChecked(false);
                        navigationView.getMenu().getItem(3).setChecked(false);
                        navigationView.setCheckedItem(R.id.nav_main);
                        mDrawerLayout.closeDrawers();
                        fragmentTransaction=getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.main_content, new mainfrag());
                        fragmentTransaction.commit();
                        getSupportActionBar().setTitle(("SGPA and CGPA Calculator"));
                        item.setChecked(true);
                        break;
                    case R.id.nav_savedcal:
                        navigationView.getMenu().getItem(0).setChecked(false);
                        navigationView.getMenu().getItem(2).setChecked(false);
                        navigationView.getMenu().getItem(3).setChecked(false);
                        navigationView.setCheckedItem(R.id.nav_savedcal);
                        mDrawerLayout.closeDrawers();
                        fragmentTransaction=getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.main_content, new savedFragment());
                        fragmentTransaction.commit();
                        getSupportActionBar().setTitle(("Saved Calculations"));
                        item.setChecked(true);
                        break;
                    case R.id.nav_upldoc:
                        navigationView.getMenu().getItem(0).setChecked(false);
                        navigationView.getMenu().getItem(1).setChecked(false);
                        navigationView.getMenu().getItem(3).setChecked(false);
                        navigationView.setCheckedItem(R.id.nav_upldoc);
                        mDrawerLayout.closeDrawers();
                        fragmentTransaction=getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.main_content, new uploadedfragment());
                        fragmentTransaction.commit();
                        getSupportActionBar().setTitle(("Uploaded documents"));
                        item.setChecked(true);
                        break;
                    case R.id.nav_site:

                        navigationView.getMenu().getItem(0).setChecked(false);
                        navigationView.getMenu().getItem(1).setChecked(false);
                        navigationView.getMenu().getItem(2).setChecked(false);
                        navigationView.setCheckedItem(R.id.nav_site);
                        mDrawerLayout.closeDrawers();
                        fragmentTransaction=getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.main_content, new resultsite());
                        fragmentTransaction.commit();
                        getSupportActionBar().setTitle(("VTU Results"));
                        item.setChecked(true);
                        break;

                }

                return false;
            }
        });

    }


    public boolean onOptionsItemSelected(MenuItem item ){
        if(mToggle.onOptionsItemSelected(item)){
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override

    public void onBackPressed() {

            DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    switch (which) {
                        case DialogInterface.BUTTON_POSITIVE: {
                            finish();
                        }


                        break;

                        case DialogInterface.BUTTON_NEGATIVE:
                            break;
                    }
                }
            };

            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Are you sure you want to exit?").setPositiveButton("Yes", dialogClickListener)
                    .setNegativeButton("No", dialogClickListener).show();

            return;
    }
}

这是我的默认片段:

public class mainfrag extends Fragment {

    private View view;
    private AdView adView;
    private Button button10;
    private Button button11;

    public mainfrag() {
        // Required empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


        view = inflater.inflate(R.layout.fragment_mainfrag, container, false);

        adView = view.findViewById(R.id.adView);

        button10 = (Button) view.findViewById(R.id.button10);
        button10.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openmainactivity();
            }
        });
        button11 = (Button) view.findViewById(R.id.button11);
        button11.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openscheme();
            }
        });
        return view;
    }

    public void openmainactivity() {
        Intent intent = new Intent(getContext(), MainActivity.class);
        startActivity(intent);
    }
    public void openscheme(){
        Intent intent=new Intent(getContext(), scheme.class);
        startActivity(intent);
    }
}

这是其他片段之一:

public class savedFragment extends Fragment {


    RecyclerView recyclerview;
    adapter_sgpa recyclerAdapter;

    ArrayList<POJO> sgpaArrayList;

    public savedFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FragmentTransaction tx = getChildFragmentManager().beginTransaction();
        tx.replace(R.id.container, new sgpa_frag());
        tx.commit();
    }

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            int id = item.getItemId();
            Fragment fragment = null;
            switch (id) {
                case R.id.navigation_sgpa:
                    sgpa_frag sf = new sgpa_frag();
                    FragmentManager fragmentManager = getChildFragmentManager();
                    fragmentManager.beginTransaction().replace(R.id.container, sf).commit();
                    return true;
                case R.id.navigation_cgpa:
                    cgpa_frag cf = new cgpa_frag();
                    fragmentManager = getChildFragmentManager();
                    fragmentManager.beginTransaction().replace(R.id.container, cf).commit();
                    return true;
            }
            return false;
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View v = inflater.inflate(R.layout.fragment_saved, container, false);

        BottomNavigationView nav = (BottomNavigationView) v.findViewById(R.id.bottom_navigation);
        nav.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
        return v;
    }
}

我应该在此代码中进行哪些更改,以便能够在按下后退按钮时从其他片段移回主片段?

【问题讨论】:

标签: android android-fragments onbackpressed


【解决方案1】:

维护一个布尔变量来检查当前片段是否为 MainFragment。

如果不是 MainFragment -> 替换 MainFragment

Else -> super.onBackPressed()

例如:

 private boolean isMainFragment=true; //make it false when move to other fragment


@Override

public void onBackPressed() {
  if(!isMainFragment){
      isMainFragment=true;
     //replace your MainFragment
    }
  else{
   //your logic show dialog or super.onBackPressed()
  }

}

【讨论】:

    【解决方案2】:

    我想我知道你需要什么。看看这个documentation的最后一部分@

    “您可以将片段事务添加到后台堆栈。后台堆栈跟踪您的应用程序中的操作,当用户单击设备上的 Android 标准“返回”按钮时可以回溯。如果您将片段事务添加到返回堆栈,然后可以通过单击设备上的后退按钮来回溯(反转)交易“来自 Jenkov 的引述

    在您提交之前,只需在您的主要活动上执行fragmentTransaction.addToBackStack(null),这将允许您使用返回按钮返回

    如果您总是想返回主片段,那么您只想将主片段添加到后台堆栈,这样在按下后退按钮时您将始终到达那里

    在你的 oncreate 的这一部分:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_what);
    
    
        mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
        mToggle=new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open, R.string.close);
        mDrawerLayout.addDrawerListener(mToggle);
        mToggle.syncState();
    
        fragmentTransaction= getSupportFragmentManager().beginTransaction();
    
    
        fragmentTransaction.add(R.id.main_content,new mainfrag());
        //HERE YOU PUT THE CODE V
        fragmentTransaction.addToBackStack(null);
        //HERE YOU PUT THE CODE ^
        fragmentTransaction.commit();
    
        ActionBar actionBar= getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    
        // ALL THE OTHER STUFF COMMING AFTER
    

    【讨论】:

    • 我应该把这段代码放在哪里? MySecondFragment mySecondFragment = new MySecondFragment(); getFragmentManager().beginTransaction() .replace(R.id.fragmentParentViewGroup, mySecondFragment) .addToBackStack(null) .commit();
    • 在您要添加 mainfrag 的顶部的主要活动中。因为你希望那个人被记住
    • 我已经放了这个——fragmentTransaction.addToBackStack(null)。我不需要在任何地方编写此代码吗? - MySecondFragment mySecondFragment = new MySecondFragment(); getFragmentManager().beginTransaction() .replace(R.id.fragmentParentViewGroup, mySecondFragment) .addToBackStack(null) .commit();我在问这个。
    • 这取决于你想要什么,在第二个片段之后是否有第三个片段?如果你在第三个并按下后退按钮你想发生什么,回到主要还是第二个?这有点难以解释,所以我建议您先尝试将 addToBackStack(null) 添加到所有这些,然后再添加到主要的,然后查看行为差异。然后你保留对你有用的东西
    • 没有。它没有。
    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多