我有一个fragment(让我们称之为MyFragment)根据参数中传递的参数膨胀不同的布局.
如果MyFragment是从不同的片段启动的,那么一切都很好.但是如果MyFragment处于活动状态并且我想要使用不同的布局参数启动新的MyFragment,则fragmentManager根本不会创建新的片段.
data.setInt("Layout index",i);
fragmentTab0 = (Fragment) new MyFragment();
fragmentTab0.setArguments(data);
fragmentTransaction.replace(R.id.fragmentContent, fragmentTab0, "MY");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
我如何强制说服fragmentTransaction再次启动片段?
注意:这里重点是我需要再次充气布局,这与之前充气的布局不同.代码如下:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
switch( getArguments().getInt("Layout index") ) {
case 1:
rootView = inflater.inflate(R.layout.firstlayout, container, false);
break;
case 2:
rootView = inflater.inflate(R.layout.secondlayout, container, false);
break;
case 3:
rootView = inflater.inflate(R.layout.thirdlayout, container, false);
break;
default: break;
}
Run Code Online (Sandbox Code Playgroud) 我希望能够replace FragmentTransaction通过使用来反转a addToBackStack():
FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
Fragment scheduleFragment = new ScheduleFragment();
fragmentTransaction.replace(R.id.content_container, scheduleFragment, "scheduleFragment");
fragmentTransaction.addToBackStack("scheduleFragment");
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
但在此之后,单击后退按钮不会执行任何操作.
从文档和它应该扭转交易.
我错过了什么?
目前我有一个"RELATIVE_LAYOUT"容器,我用它来添加我的片段.我在按钮上使用OnClickListener将片段XML布局加载到RelativeLayout容器中.
我想要实现的是,当我按下按钮一次时,片段应该加载......当我再次按下它时,应该删除片段.我已经尝试使用整数来识别是否加载了片段,但是失败了.任何帮助赞赏......
码:
public class MainActivity extends Activity {
Button B1,B2;
int boolb1=0, boolb2=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
B1 = (Button)findViewById(R.id.btn1);
B2 = (Button)findViewById(R.id.btn2);
B1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
FragmentOne f1 = new FragmentOne();
if(boolb1==0)
{ft.add(R.id.frg1, f1);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
boolb1=1;}
else
{ft.remove(f1);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
boolb1=0;}
//ft.addToBackStack("f1");
ft.commit();
}
});
B2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction(); …Run Code Online (Sandbox Code Playgroud) java android android-fragments fragmenttransaction fragmentmanager
我正在做一个基于NavigationDrawer的应用程序.我有一个如下所示的层次结构
NavigationDrawer - > RootFragment(未添加到后面的堆栈) - >详细信息片段(添加到后台堆栈)
现在,我试图通过按后退按钮尝试退出应用程序时向用户显示一条消息.这是我正在使用的代码.
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStack();
}
else if (getFragmentManager().getBackStackEntryCount() == 0) {
new AlertDialog.Builder(this)
.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
MainActivity.this.finish();
}
})
.setNegativeButton("No", null)
.show();
}
else
{
super.onBackPressed();
}
}
Run Code Online (Sandbox Code Playgroud)
当我从详细信息片段中单击后退按钮(添加到后台堆栈)时,我收到警报消息.相反,我会回到根片段.
但是,如果我像这样更新代码,按后退按钮会将用户带回到根视图.所以它看起来像getFragmentManager().getBackStackEntryCount()即使将详细片段添加到后台堆栈也是零.
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStack();
}
else
{
super.onBackPressed();
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我从rootFragment调用详细信息片段的方法.
FragmentManager …Run Code Online (Sandbox Code Playgroud) android android-fragments fragmenttransaction fragment-backstack
我在导航图中总共有12个片段..每个片段都有一个凌空方法.每个片段显示自己的凌空响应,除了position = 1和position = 5片段.
当我的应用程序启动
情形1: 我打开位置1片段,并且在打开位置5片段后,两个片段都具有位置1片段响应.
场景2:如果我打开位置5片段并且在打开位置1片段之后比两个片段都具有位置1片段响应.
场景1图像:
场景2图像:
我的片段事务方法类:
private void showFragment(Fragment fragment) {
llContainer = (LinearLayout)findViewById(R.id.container);
if (fragment != null) {
llContainer.removeAllViewsInLayout();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, fragment, fragment.getClass().getName());
fragmentTransaction.commit();
fragmentManager.popBackStack();
}
}
@Override
public void onItemSelected(int position) {
Fragment frag = null;
switch (position) {
case POS_HOME:
frag = FragmentHome.instance(screenTitles[position]);
break;
case POS_INBOX:
txtToolbarTitle.setVisibility(View.VISIBLE);
txtToolbarTitle.setText("Notifications");
frag = FragmentInbox.instance(screenTitles[position]);
break;
case POS_LOG:
frag = FragmentLog.instance(screenTitles[position]);;
break;
case POS_BOOK:
frag = FragmentBook.instance(screenTitles[position]); …Run Code Online (Sandbox Code Playgroud) android android-fragments fragmenttransaction android-volley
我正在尝试使用幻灯片进/出动画实现片段事务.我正在开发至少14 sdk所以ObjectAnimator对我来说是唯一的选择(还有其他方法吗?根据我的理解,翻译动画不可用).
守则很简单:
AnimationView.java - 包装类
public class AnimationView extends LinearLayout {
public AnimationView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public float getYFraction() {
return getHeight();
}
public void setYFraction(float yFraction) {
final int height = this.getHeight();
setY((height > 0) ? (yFraction * height) : -9999);
}
}
Run Code Online (Sandbox Code Playgroud)
滑入和滑出xml
<?xml version="1.0" encoding="utf-8"?>
<set>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="yFraction"
android:valueType="floatType"
android:valueFrom="-1"
android:valueTo="0"
android:duration="600"/>
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="utf-8"?>
<set>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="yFraction"
android:valueType="floatType"
android:valueFrom="0"
android:valueTo="1"
android:duration="600"/>
Run Code Online (Sandbox Code Playgroud)
动画效果很好,你可以看到我使用了自定义属性yFraction.但性能非常糟糕......在某些平板电脑中,我注意到动画期间有一条水平的白线(大约3像素高),在其他智能手机设备中,它只是变慢(不是持续时间慢而是闪烁).
如果我将valueFrom&valueTo设置为适合视图维度,我找到了修复它的方法,但它不是通用的,并且需要0到1才能对所有视图都通用 …
android android-animation android-fragments objectanimator fragmenttransaction
所以我要说我有以下片段:
Fragment1 Fragment2 DialogFragment Fragment3 Fragment4
让我们说我转到下面的片段,每个fragmetn被添加到后栈:
Fragment1 -> Fragment2 -> DialogFragment -> Fragment3 -> Fragment4
Run Code Online (Sandbox Code Playgroud)
如果我单击BACK按钮,这通常应该转到Fragment3,而是显示DialogFragment.
以下是我使用的片段交易:
Fragment1 - > Fragment2
FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.mainContentHolder, new Fragment2(), "Fragment2");
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
Fragment2 - > DialogFragment
FragmentTransaction ft2 = getFragmentManager().beginTransaction();
ft2.setCustomAnimations(R.anim.flipp_in,R.anim.flipp_static);
ft2.add(R.id.mainContentHolder, new DialogFragment(), "DialogFragment");
ft2.addToBackStack(null);
ft2.commit();
ft2.hide(Fragment1.this);
Run Code Online (Sandbox Code Playgroud)
DialogFragment - > Fragment3
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.mainContentHolder, new Fragment3(), "Fragment3");
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
Fragment3 - > Fragment4
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.mainContentHolder, new Fragment4(), "Fragment4");
ft.addToBackStack(null);
ft.commit(); …Run Code Online (Sandbox Code Playgroud) 我在Android中有一个标签式界面,并在我的应用程序中使用FrameLayout作为我的主要布局.我收到一条Android Lint警告说:
This <FrameLayout> can be replaced with a <merge\> tag
Run Code Online (Sandbox Code Playgroud)
我使用此FrameLayout(名为fragmentContainer)的唯一位置是onTabSelected侦听器.这是一个简化版本.
@Override
public void onTabSelected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
// When the given tab is selected, show the tab contents in the
// container
Fragment fragment;
String tag;
switch (tab.getPosition()) {
case 0:
fragment = new myFragment1();
tag = "myFragment1";
break;
case 1:
fragment = new new myFragment2();
tag = "myFragment2";
break;
default:
Log.d(TAG, "invalid tab selected: " + tab.getPosition());
break;
}
fragmentTransaction.replace(R.id.fragmentContainer, fragment, tag);
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但我希望尽可能提高性能,并尽可能摆脱任何Lint警告.如果我用合并标记替换FrameLayout,我不能调用fragmentTransaction(),因为id在任何地方都不存在.
这是FrameLayout的完整性:
<FrameLayout …Run Code Online (Sandbox Code Playgroud) 我想要实现的效果是将输入(新)片段覆盖在退出(旧)片段之上,但是当我用新片段替换旧片段时,旧片段就会消失,新片段向上滑动容器,这是可见的(容器).
我不想为旧片段设置动画,只是保持旧片段不变,并且当它可见时滑动它上面的新片段.
以下是我的代码:
// First time adding fragment i.e. "oldFragemnt"
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, oldFragment, "oldFragemnt");
ft.addToBackStack(null);
ft.commit();
// while adding "newFragemnt"
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.new_slide_in_up,0,0,R.anim.new_slide_out_down);
ft.replace(R.id.content_frame, newFragment, "newFragemnt");
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
指导我出错的地方.当新片段向上滑动时,我的旧片段正在消失.
android android-animation android-fragments fragmenttransaction
我正在开发一个使用片段的应用程序,上周我的测试设备进行了lolipop更新.当我在lolipop设备上测试我的应用程序时,我看到Fragment Transaction的替换方法无法正常工作.
虽然在Kitkat版本上一切都很好,但它在Lolipop版本中令人困惑.
为了解释我的情况,我添加了一些图片.
--First Screen ---------------------------- KitKat ----------------- - - - - - - - - - - 棒糖 - - - - - - -

正如你所看到的,当我使用时kitkat,一切都很好,但是一旦我使用lolipop片段事务替换就会令人困惑.
这是我的按钮代码;
mButtonOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FeedbackFragment mFragmentFeedBack = new FeedbackFragment();
android.app.FragmentManager fm = getFragmentManager();
fm.executePendingTransactions();
android.app.FragmentTransaction fragmentTransaction = fm.beginTransaction();
if (mFragmentFeedBack.isVisible()) {
fragmentTransaction.hide(mFragmentFeedBack);
} else {
if (!mFragmentFeedBack.isAdded()) {
fragmentTransaction.replace(R.id.containerfragment, mFragmentFeedBack);
}
fragmentTransaction.show(mFragmentFeedBack);
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
Run Code Online (Sandbox Code Playgroud)
这是我的xml;
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" …Run Code Online (Sandbox Code Playgroud)