我想覆盖片段的自定义行为。
我的活动中有三个不同的片段。其中有两个是工具栏和横幅,因此我不想再讨论这两个。但是在另一个片段中,我想在按下后退按钮时覆盖自定义行为。
后退按钮不是Android的后退按钮,而是我在第一个片段上创建的其他按钮:工具栏,当用户单击我的后退按钮时,片段将启动界面的方法。就是这样:
mListener.onToolbarInteraction(v);
我试图重写onBackPressed()Android的方法并编写了我的代码。此外,我在片段上设置了我想要的行为的标签,但在其他两个片段中却没有。
这是活动的XML:
.XML:
<fragment
android:id="@+id/fm_toolbar"
android:layout_width="800dp"
android:layout_height="wrap_content"
class="com.iurban.restaurant.Fragments.MainFragment"/>
<fragment
android:id="@+id/fl_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/alphaBlack"
app:layout_constraintTop_toBottomOf="@id/fm_toolbar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toTopOf="@id/fm_banner"
class="com.iurban.restaurant.Fragments.MainFragment"/>
<fragment
android:id="@+id/fm_banner"
android:layout_width="800dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
class="com.iurban.restaurant.Fragments.MainFragment"/>
这是初始化片段的方法:
启动方法:
private void startMenu(short idFather){
MainFragment mainFragment = new MainFragment(getApplicationContext(), usedLang.getId(), idFather);
fragmentManager.beginTransaction()
.replace(R.id.fl_container, mainFragment)
.addToBackStack(CustomConstants.LEVEL)
.commit();
}
private void startToolbar(){
ToolbarFragment toolbarFragment = new ToolbarFragment(usedLang);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fm_toolbar,toolbarFragment)
.show(fmToolbar)
.commit();
}
private void startBanner(){
BannerDAO bannerDAO = new BannerDAO(getApplicationContext());
Banner banner = bannerDAO.obtainingUniqueBanner();
if(banner != null && banner.getActive() == 1){
BannerFragment bannerFragment = new BannerFragment(banner, getApplicationContext(), (byte)usedLang.getId());
getSupportFragmentManager().beginTransaction()
.replace(R.id.fm_banner,bannerFragment)
.show(fmBanner)
.commit();
}else{
getSupportFragmentManager().beginTransaction()
.hide(fmBanner)
.commit();
}
}
这是在背面按下的替代:
@Override
public void onBackPressed() {
int count = getSupportFragmentManager().getBackStackEntryCount();
if (count > 1) {
super.onBackPressed();
}
}
我期望的行为是级别列表导航。在菜单片段中,您有一个recyclerview,当您单击/点击某个元素时,您将“进入下一个级别”,并且显示了您单击的元素的子代列表。因此,当您按回时,我希望该应用程序返回到最后一个列表,但是我得到的结果(转到第三级菜单)为:
我只是意识到(打印日志)后退堆栈已更新,但该片段未更新。
我编写了此方法来打印后退堆栈的ID:
private void printStack(){
int count = getSupportFragmentManager().getBackStackEntryCount();
Log.e("BACKSTACK","-----------------------------------------------");
for(int i = 0; i < count; i++){
Log.e("BACKSTACK",String.valueOf(getSupportFragmentManager().getBackStackEntryAt(i).getId()));
}
}
当我点击后退按钮(在菜单的第三层)时,我执行的打印日志的方法将打印出以下内容:
在super.onBackPressed()之后;打印此:
但是该片段未更新,仍然显示相同的级别。
答案 0 :(得分:0)
只需尝试一下....
当您需要后退行为时(如下所示)开始添加.addToBackStack(null)
方法。
getSupportFragmentManager().beginTransaction().replace(R.id.layout_parent_id, new YourFragment()).addToBackStack(null).commit();
当您不需要后退行为时,也不要使用.addToBackStack(null)
方法。
注意:-您无需在onBackPressed()
方法内做任何事情。