【问题标题】:how to handle multiple fragments onbackpressed如何处理多个片段 onbackpressed
【发布时间】:2017-08-31 11:00:01
【问题描述】:

主 Activity 具有底部导航,其中包含 5 个片段。每个片段里面有多个片段。如何处理其中的onbackpressed。

主页.java

public class Homepage extends AppCompatActivity {
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment selectedFragment = null;
        switch (item.getItemId()) {
            case R.id.home:
                selectedFragment = Fragment_home.newInstance();
                break;
            case R.id.eventsfeed:
                selectedFragment = Fragment_eventsfeed.newInstance();
                break;
            case R.id.events:
                selectedFragment = Fragment_events.newInstance();
                break;
            case R.id.messages:
                selectedFragment = Fragment_messages.newInstance();
                break;
            case R.id.settings:
                selectedFragment = Fragment_settings.newInstance();
                break;
        }
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.content, selectedFragment);
        transaction.commit();
        return true;

    }

};


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

    Fragment fragmentnewview = new Fragment_home();
    FragmentManager frMan = getSupportFragmentManager();
    FragmentTransaction frTr = frMan.beginTransaction();
    frTr.add(R.id.content,fragmentnewview);
    frTr.commit();

    BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    BottomNavigationViewHelper.disableShiftMode(navigation);

}}

Fragment_home.java

public class Fragment_home extends Fragment {

public static Fragment_home newInstance(){
        Fragment_home fragment=new Fragment_home();
    return fragment;
}

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View view=inflater.inflate(R.layout.fragment_home, container, false);
    CardView card=(CardView)view.findViewById(R.id.next_page_home_card);

    card.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view.setVisibility(View.GONE);
            Fragment fragmentnewview = new Event_details();
            FragmentManager frMan = getActivity().getSupportFragmentManager();
            FragmentTransaction frTr = frMan.beginTransaction();
            frTr.add(R.id.content,fragmentnewview);
            frTr.commit();
        }
    });


    return view;
}

}

在那个 Fragment_home.java 里面我有一个卡片视图,当它点击它会转到下一个片段 Event_Details.java

Event_Details.java

public class Event_details extends Fragment {
Button add_comments;
ImageButton back;
public static Event_details newInstance(){
    Event_details fragment=new Event_details();
    return fragment;
}

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View view=inflater.inflate(R.layout.event_details, container, false);
    add_comments=(Button)view.findViewById(R.id.add_comment);

    back=(ImageButton)view.findViewById(R.id.back);

    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view.setVisibility(View.GONE);
            Fragment fragmentnewview = new Fragment_home();
            FragmentManager frMan = getActivity().getSupportFragmentManager();
            FragmentTransaction frTr = frMan.beginTransaction();
            frTr.add(R.id.content,fragmentnewview);
            frTr.commit();
        }
    });
    add_comments.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view.setVisibility(View.GONE);
            Fragment fragmentnewview = new Comments();
            FragmentManager frMan = getActivity().getSupportFragmentManager();
            FragmentTransaction frTr = frMan.beginTransaction();
            frTr.add(R.id.content,fragmentnewview);
            frTr.commit();
        }
    });


    return view;
}

}

我在 Event_Details.java 中有一个按钮,点击它会调用另一个片段 Comments.java

评论.java

public class Comments extends Fragment {
ImageButton back;
public static Comments newInstance(){
    Comments fragment=new Comments();
    return fragment;
}

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View view=inflater.inflate(R.layout.add_your_comments, container, false);
    back=(ImageButton)view.findViewById(R.id.back);

    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view.setVisibility(View.GONE);
            Fragment fragmentnewview = new Event_details();
            FragmentManager frMan = getActivity().getSupportFragmentManager();
            FragmentTransaction frTr = frMan.beginTransaction();
            frTr.add(R.id.content,fragmentnewview);
            frTr.commit();
        }
    });


    return view;
}

}

back.setOnClickListener 是要返回的图像按钮,但我无法在硬件返回按钮中实现。

【问题讨论】:

  • 试着把你的代码,你测试了什么,你做了什么......我们不是魔术师知道你在做什么来解决问题
  • 我更新了代码。

标签: android fragment


【解决方案1】:

你需要@Override你的活动onBackPressed()方法!!! 关于您的问题有很多很好的信息和答案!如果你想成为优秀的程序员,你需要良好的研究技能!!! :)) 尝试自己研究和解决问题。写一些代码,毕竟如果你仍然不能解决你的问题,我会给你复制和粘贴的代码:)

【讨论】:

  • 是的.. 谢谢你.. 但我也实现了 addtobackstank 和 popbackstack ..
  • 我解决了问题,我将 frTr.add() 更改为 frTr.replace 并在代码中实现了 backstack.. 问题解决了
【解决方案2】:

加载片段时,在 FragmentTransaction 上使用 addToBackStack(null)。如果你这样做,返回按钮将撤销交易。

【讨论】:

    【解决方案3】:

    @Override onBackPressed() method as @L.Petrosyan told, insideonBackPressed()get the current position of your viewpager usingviewPager.getCurrentItem(); it will return you anint` 值。使用该值来管理您的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多