❶ 关于android Fragment的问题
1、概述
首先我们简单回顾一下,相信大家对Fragment的都不陌生,对于Fragment的使用,一方面Activity需要在布局中为Fragment安排位置,另一方面需要管理好Fragment的生命周期。Activity中有个FragmentManager,其内部维护fragment队列,以及fragment事务的回退栈。
一般情况下,我们在Activity里面会这么添加Fragment:
[java] view plain 在CODE上查看代码片派生到我的代码片
public class MainActivity extends FragmentActivity
{
private ContentFragment mContentFragment ;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
mContentFragment = (ContentFragment) fm.findFragmentById(R.id.id_fragment_container);
if(mContentFragment == null )
{
mContentFragment = new ContentFragment();
fm.beginTransaction().add(R.id.id_fragment_container,mContentFragment).commit();
}
}
}
针对上面代码,问两个问题:
1、为什么需要判null呢?
主要是因为,当Activity因为配置发生改变(屏幕旋转)或者内存不足被系统杀死,造成重新创建时,我们的fragment会被保存下来,但是会创建新的FragmentManager,新的FragmentManager会首先会去获取保存下来的fragment队列,重建fragment队列,从而恢复之前的状态。
2、add(R.id.id_fragment_container,mContentFragment)中的布局的id有何作用?
一方面呢,是告知FragmentManager,此fragment的位置;另一方面是此fragment的唯一标识;就像我们上面通过fm.findFragmentById(R.id.id_fragment_container)查找~~
好了,简单回顾了一下基本用法,具体的还请参考上面的博客或者其他资料,接下来,介绍一些使用的意见~~
2、Fragment Arguments
下面描述一个简单的场景,比如我们某个按钮触发Activity跳转,需要通过Intent传递参数到目标Activity的Fragment中,那么此Fragment如何获取当前的Intent的值呢?
有哥们会说,这个简单?看我的代码(问题代码):
[java] view plain 在CODE上查看代码片派生到我的代码片
public class ContentFragment extends Fragment
{
private String mArgument ;
public static final String ARGUMENT ="argument";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mArgument = getActivity().getIntent().getStringExtra(ARGUMENT);
}
我们直接在Fragment的onCreate中,拿到宿主Activty,宿主Activity中肯定能通过getIntent拿到Intent,然后通过get方法,随意拿参数~~
这么写,功能上是实现了,但是呢?存在一个大问题:我们用Fragment的一个很大的原因,就是为了复用。你这么写,相当于这个Fragment已经完全和当前这个宿主Activity绑定了,复用直接废了~~~所以呢?我们换种方式,推荐使用arguments来创建Fragment。
[java] view plain 在CODE上查看代码片派生到我的代码片
public class ContentFragment extends Fragment
{
private String mArgument;
public static final String ARGUMENT = "argument";
@Override
public void onCreate(Bun www.hbbz08.com dle savedInstanceState)
{
super.onCreate(savedInstanceState);
// mArgument = getActivity().getIntent().getStringExtra(ARGUMENT);
Bundle bundle = getArguments();
if (bundle != null)
mArgument = bundle.getString(ARGUMENT);
}
/**
* 传入需要的参数,设置给arguments
* @param argument
* @return
*/
public static ContentFragment newInstance(String argument)
{
Bundle bundle = new Bundle();
bundle.putString(ARGUMENT, argument);
ContentFragment contentFragment = new ContentFragment();
contentFragment.setArguments(bundle);
return contentFragment;
}
给Fragment添加newInstance方法,将需要的参数传入,设置到bundle中,然后setArguments(bundle),最后在onCreate中进行获取;
这样就完成了Fragment和Activity间的解耦。当然了这里需要注意:
setArguments方法必须在fragment创建以后,添加给Activity前完成。千万不要,首先调用了add,然后设置arguments。
❷ Android Fragment怎么强制销毁
android fragment的生命周期是随着绑定的activity的,所以要强制销毁的话,可以把ativity杀死。如果不需要fragment你可以先hide隐藏掉即可。
❸ android 依次打开多个fragment怎么关闭相对应的
你可以给ViewPager里面放View,比如说一个空的FrameLayout,当你划过去后,给这个FrameLayout绑定Fragment,这时候Fragment才会去加载 查看原帖>>
❹ android 从viewpager中删除一个fragment的方法怎么解决 在线等
为了解决彻底删除fragment,我们要做的是:
1.将FragmentPagerAdapter 替换成FragmentStatePagerAdapter,因为前者只要加载过,fragment中的视图就一直在内存中,在这个过程中无论你怎么刷新,清除都是无用的,直至程序退出; 后者 可以满足我们的需求。
2.我们可以重写Adapter的方法--getItemPosition(),让其返回PagerAdapter.POSITION_NONE即可。
[java] view plain
以下为引用内容:
@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return PagerAdapter.POSITION_NONE;
}
我最后的代码:
[java] view plain
package com.yang.Adapter;
import java.util.ArrayList;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerAdapter;
public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
private static final String TAG = "MyFragmentPagerAdapter";
// private ArrayList<OpilistItem> lists;
private ArrayList<Fragment> mList;
private Context mContext;
public MyFragmentPagerAdapter(FragmentManager fm, Context context) {
super(fm);
this.mContext = context;
mList = new ArrayList<Fragment>();
}
public void setLists(ArrayList<Fragment> lists) {
this.mList = lists;
}
public void UpdateList(ArrayList<Fragment> arrayList) {
this.mList.clear();
this.mList.addAll(arrayList);
notifyDataSetChanged();
}
@Override
public Fragment getItem(int arg0) {
// Fragment ft = null;
//
// ft = new DateShow(mContext);
// for (int i = 0; i < lists.get(arg0).openplayitem.size(); i++) {
// Log.i(TAG,
// "arg0=" + arg0 + "name="
// + lists.get(arg0).openplayitem.get(i).moviename);
// }
//
// Bundle args = new Bundle();
// args.putSerializable("date_title", lists.get(arg0).openplayitem);
// ft.setArguments(args);
// return ft;
return mList.get(arg0);
}
@Override
public int getCount() {
return mList.size();
}
@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return PagerAdapter.POSITION_NONE;
}
}
之前还有一个问题,就是在fragment中报空指针异常,是因为我要加载的动态加载的fragment只有一个,但是viewpager默认会去加载下一个,使得浏览流畅,从我注释的代码中可以看到,数据的传递是通过bundle,造成预加载的时候数据成空,造成空指针异常,解决的办法是在fragment的onCreateView方法中判断数据是否为空,然后再判断是不是生成并返回view。
❺ Android 开发 fragment中一个按钮实现关闭此fragment功能,监听事件是在Activit中写还是fragment中写
看你监听到后续处理,如果有activity逻辑处理就写在activity
❻ android应用关闭了 销毁了 但是fragment里边的handler还在运行 怎么回事
1、不要直接将Fragement写在XML文件里,这样会导致Fragment对象无法销毁,产生内存溢出。在代码动态的new 和add Fragement才是正确的做法。 2、使用抽屉方法,在XML文件里放两个LinearLayout,然后在代码中将Fragment加进这两个LinearLayout中
❼ android用什么方法可以直接让当前fragment消失
可以参考我的csdn博客上,可以使用fragmentmanager来进行管理,最后别忘了commit
❽ Android怎么finish掉Activity和fragment
首先如果你写了finish()并且位置正确,应该不会出现你说的那种情况,你可以贴出源代码看看。
fragment写finish():getActivity().finish()。
❾ android 怎样隐藏当前的fragement
解决方法 1:
您可以使用此方法要锁定或解锁抽屉: DrawerLayout.setDrawerLockMode(...) 。(也有两个其他版本的此方法,以指定特定抽屉锁模式)。若要锁定,使用 DrawerLayout.LOCK_MODE_LOCKED_CLOSED ; 要解除锁定,请使用DrawerLayout.LOCK_MODE_UNLOCKED 。
如果您正在使用 ActionBarDrawerToggle,您需要添加一些额外的代码以防止抽屉打开时他们单击 ActionBarDrawerToggle,如果你把锁抽屉。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// check lock mode before passing to ActionBarDrawerToggle
// I assume your drawer is on the left; if not, use Gravity.RIGHT
int lockMode = mDrawer.getDrawerLockMode(Gravity.LEFT);
if (lockMode == DrawerLayout.LOCK_MODE_UNLOCKED &&
mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle your other action bar items...
return super.onOptionsItemSelected(item);
}