【发布时间】:2019-01-09 11:45:51
【问题描述】:
我想覆盖片段的自定义行为。
我的 Activity 中有三个不同的片段。其中两个是工具栏和横幅,所以我不想回到这两个。但在另一个片段中,我想在按下后退按钮时覆盖自定义行为。
并且后退按钮不是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,当您单击/点击一个元素时,您“进入下一个级别”,它会显示您单击的元素的子元素列表。因此,当您按下返回时,我预计应用程序会返回最后一个列表,但我得到的结果(进入第三级菜单)是:
- 点击一次,没有任何反应。
- 您再次点击并返回 1 级。
- 点击此处不会发生任何事情。
我只是意识到(打印日志)后台堆栈已更新,但片段未更新。
我写了这个方法来打印回栈的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()));
}
}
当我点击返回按钮(在第三级菜单上)时,我打印日志的方法会打印:
- E/BACKSTACK:0
- 电子/后台:1
- 电子/后台:2
在 super.onBackPressed(); 之后打印这个:
- E/BACKSTACK:0
- 电子/后台:1
但是片段没有更新,它仍然显示相同的级别。
【问题讨论】:
-
试着把 if(count == 1)
-
你对流量的解释不清楚。
-
@Ashish 它不起作用。
标签: android android-fragments back