我正在制作一个这样的简单应用:
按钮“Push Fragment”替换当前片段 用一个新的。 “Pop Fragment”按钮应该从堆栈中删除一个片段。
这是活动的代码:
public class ActivityWithMenu extends Activity{
private WVFragment wvFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_with_menu);
wvFragment = (WVFragment) getFragmentManager().findFragmentById(R.id.wv_fragment);
Button btnBack = (Button)findViewById(R.id.btnPopFragment);
btnBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fm = getFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
Log.i("FRAGMENT_EXAMPLE", "will pop the current fragment");
fm.popBackStack();
}
}
});
Button btnPush = (Button)findViewById(R.id.btnPushFragment);
btnPush.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.wv_fragment, wvFragment);
transaction.addToBackStack(null);
transaction.commit();
WebView wv = (WebView)wvFragment.getView().findViewById(R.id.webview);
wv.setWebViewClient(new WebViewClient());
wv.loadUrl("http://www.google.com");
}
});
}
}
这是activity_with_menu视图:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Pop Fragment"
android:id="@+id/btnPopFragment"
android:layout_alignParentTop="true"
></Button>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Push Fragment"
android:id="@+id/btnPushFragment"
android:layout_below="@+id/btnPopFragment"
></Button>
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/btnPushFragment"
android:id="@+id/wv_fragment"
class="com.lucasdev.baseactivitydemo.WVFragment"
/>
</RelativeLayout>
这是碎片:
public class WVFragment extends Fragment{
private View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.wv_fragment, container, false);
WebView wv = (WebView)view.findViewById(R.id.webview);
wv.loadUrl("http://www.stackoverflow.com");
return view;
}
}
这是片段视图:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
我不知道我做错了什么,因为“Pop Fragment”没有删除 推送新片段后的任何片段。
但我知道popBackStack()被调用,因为消息总是打印在 控制台。
那么,我做错了什么?
答案 0 :(得分:1)
每次点击推送时,您都必须添加新的Fragment
。
fragment = new WVFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.wv_fragment, fragment );
transaction.addToBackStack(null);
transaction.commit();
WebView wv = (WebView)fragment.getView().findViewById(R.id.webview);
因为如果你添加片段的相同(实例),你就不会有另一个片段。
答案 1 :(得分:1)
不使用popBackStack()
弹出当前片段,只需使用活动的原生BackButton方法。
示例:强>
Button btnBack = (Button)findViewById(R.id.btnPopFragment);
btnBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ActivityWithMenu.this.onBackPressed();
}
});
onBackPressed 将具有弹出片段所需的相同功能。
答案 2 :(得分:1)
首先,尝试从XML中删除您的片段并在那里保留一个空容器:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Pop Fragment"
android:id="@+id/btnPopFragment"
android:layout_alignParentTop="true"
></Button>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Push Fragment"
android:id="@+id/btnPushFragment"
android:layout_below="@+id/btnPopFragment"
></Button>
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:id="@+id/fragmentcontainer">
</FrameLayout>
</RelativeLayout>
然后你需要从代码中添加你的Fragment ie com.lucasdev.baseactivitydemo.WVFragment片段,即你的btnPush的onClick()
。
如果问题仍然存在,请告诉我。