❶ 關於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);
}