❶ android,兩個Fragment之間怎麼用Argument傳值
Fragment之間的傳值交互無法直接進行,也不建議直接進行。需要通過activity進行中轉。
簡單的例子
java">1、Activity定義
publicclassActextendsActivity{
privateFragmentf1=null;
privateFragmentf2=null;
publicinterfaceMyCallBack{//定義回調介面
voidcallBack(Stringparam);//回調方法
}
publicvoidonCreate(Bundlebd){
super.onCreate(bd);
f1=(Fragment)findViewById(R.id.xxxx1);//獲取fragment1
f2=(Fragment)findViewById(R.id.xxxx2);//獲取fragment2
f1.setCallBack(newMyCallBack(){//往fragment1中設置回調介面,便於傳遞參數到activity中
publicvoidcallBack(Stringparam){
f2.showParam(param);//回調介面中,把參數傳遞到fragment2中
}
});
}
}
2、Fragment1定義
{
MyCallBackcb=null;
publicvoidsetCallBack(MyCallBackcb){//設置回調介面
this.cb=cb;
}
publicvoidpostParam(){
this.cb.callBack("2222");//調用回調介面
}
}
3、Fragment2定義
{
publicvoidshowParam(Stringparams){//顯示輸入的值
...顯示params
}
}
❷ android 怎麼在fragment中切換fragment
版本說明
fragment是在3.0版本引入的,但是也可以在以前的版本中使用,需要引入android-support-v4.jar支持包,當然調用的方法也不一樣,下面介紹的方法兼容了3.0以前的版本,主要介紹fragment的切換
需要做的准備
新建一個android項目,主Activity命名為MainActivity
創建三個Fragment1 Fragment2 Fragment3
為三個Fragment創建三個布局文fragment1.xml、fragment2.xml、fragment3.xml
布局 activity_main.xm
fragment1.xml樣例
Fragment1樣例
另外的可以根據樣例進行修改
activity_main.xml內容
activity打開時我們需要顯示一個fragment,也就是需要先向容器中添加一個fragment
這是就能顯示第二個fragment了,那麼如何切換不同的fragment呢,切換的過程如下
開啟事務
調用事務的replace方法,將當前容器的fragment替換為新的fragment
提交事務
注意上圖紅框中的addToBackStack方法,很多人都不是很清楚這個方法的實際作用,說一下程序運行時候的現象你就明白了
初始化時顯示的是 fragment2
實踐1 :fragment2------點擊按鈕frag1-----按返回鍵--------退出應用
實踐2: fragment2-----點擊按鈕frag3 -----按返回鍵--------返回到fragment2
為啥會出現上面的情況,原因就是切換到fragment3時,調用了addToBackStack方法,這時會將fragment2先入棧,然後再切換到fragment3,按返回鍵的時候fragment3銷毀,fragment2出棧顯示,而切換到fragme1時沒有將fragme2入棧,所以fragment2就直接銷毀了,再按返回鍵就直接退出應用了
樣例代碼可以從網路網盤上下載
❸ android 怎麼刷新fragment頁面
通常的做法,在onResume中發一起一個非同步的請求去拿數據,通過回調,收到返回的數據,然後更新UI。
網路獲取數據結束判斷數據有更新,然後通過set將控制項的數據更新。
舉例:
這個是我的一個fragment,我把它放在一個viewpager的fragment中
{
privatestaticfinalStringARG_CITY="city";
privateStringmCity;
privateTextViewtmpD;
privateTextViewtmpN;
privateSimpleDraweeViewimageD;
privateSimpleDraweeViewimageN;
(Stringcity){
BottomFragmentOnefragment=newBottomFragmentOne();
Bundleargs=newBundle();
args.putString(ARG_CITY,city);
fragment.setArguments(args);
returnfragment;
}
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
if(getArguments()!=null){
mCity=getArguments().getString(ARG_CITY);
}
}
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
//
Viewview=inflater.inflate(R.layout.bottom_fragment_one,container,false);
tmpD=(TextView)view.findViewById(R.id.tmp_d);
tmpN=(TextView)view.findViewById(R.id.tmp_n);
imageD=(SimpleDraweeView)view.findViewById(R.id.image_d);
imageN=(SimpleDraweeView)view.findViewById(R.id.image_n);
setUI();
returnview;
}
//用來設置UI,更新UI時重新從資料庫獲取數據,進行設置
publicvoidsetUI(){
Forecastforecast=mFrecastDao.getForecastByCity(mCity);
tmpD.setText(forecast.getDaily_1_max());
tmpN.setText(forecast.getDaily_1_min());
imageD.setImageURI(getImageUri(forecast.getDaily_1_code_d()));
imageN.setImageURI(getImageUri(forecast.getDaily_1_code_n()));
}
}
2.除了上面那個,還有一個類似的fragment,我想實按下按鈕後,在兩個fragment之間進行切換。下面是按鈕代碼
@Override
publicvoidonClick(Viewv){
FragmentManagerfm=getChildFragmentManager();
//開啟Fragment事務
=fm.beginTransaction();
switch(v.getId())
{
caseR.id.button_left:
if(mBottomOne==null)
{
mBottomOne=newBottomFragmentOne().newInstanceOne(mCity);
}//使用當前Fragment的布局替代id_content的控制項
transaction.replace(R.id.bottom_weather,mBottomOne);
break;
caseR.id.button_right:
if(mBottomTwo==null)
{
mBottomTwo=newBottomFragmentTwo().newInstanceTwo(mCity);
}
transaction.replace(R.id.bottom_weather,mBottomTwo);
break;
}
//事務提交
transaction.commit();
}
3.下面是viewpager中的fragment用來更新上面兩個fragment數據的方法。
publicvoidUpdateUI(){
mBottomOne.setUI();
mBottomTwo.setUI();
}
❹ android fragment 實例化問題
用單例模式
先讓構造函數私有化 private XXXfragment(){}
然後寫一個私有成員變數 private XXXfragment fragment;
再寫一個獲取變數的方法
public XXXfragment getInstance(){
if(fragment==null){
fragment= new XXXfragment();
}
return fragment;
}
❺ android 當前fragment怎麼獲取
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();
}
}
}
❻ android中在fragment A裡面點擊button跳轉到fragment B怎麼實現
方法一:直接getActivity,使用activity的fragmenttransation的replace方法替換
假設
{
privateButtonbtn;
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
Viewview=inflater.inflate(R.layout.frag_one,null);
btn=(Button)view.findViewById(R.id.button);
btn.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
FragmentManagerfm=getActivity().getFragmentManager();
fm.beginTransaction()
//替換為TwoFragment
.replace(R.layout.fragment_container,newTwoFragment())
.commit();
}
});
returnsuper.onCreateView(inflater,container,savedInstanceState);
}
}
但是這樣做會使OneFragment和原activity的耦合度提高,fragment設計出來就是有重用的目的,所以不好,使用方法二
方法2:定義回調函數,當button按下調用回調
{
privateButtonbtn;
;
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
Viewview=inflater.inflate(R.layout.frag_one,null);
btn=(Button)view.findViewById(R.id.button);
btn.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
if(onButtonClick!=null){
onButtonClick.onClick(btn);
}
}
});
returnsuper.onCreateView(inflater,container,savedInstanceState);
}
(){
returnonButtonClick;
}
publicvoidsetOnButtonClick(OnButtonClickonButtonClick){
this.onButtonClick=onButtonClick;
}
publicinterfaceOnButtonClick{
publicvoidonClick(Viewview);
}
}
這樣只要在acitivty中設置回調即可
{
privateOneFragmentoneFragment=newOneFragment();
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//。。。
//。。。省略代碼
oneFragment.setOnButtonClick(newOnButtonClick(){
@Override
publicvoidonClick(Viewview){
//切換到TwoFragment
fm.beginTransaction()
//替換為TwoFragment
.replace(R.layout.fragment_container,newTwoFragment())
.commit();
}
});
}
}
❼ 在Android開發中fragment有什麼優缺點
自從Android 3.0中引入fragments 的概念,根據詞海的翻譯可以譯為:碎片、片段。其目的是為了解決不同屏幕分辯率的動態和靈活UI設計。大屏幕如平板小屏幕如手機,平板電腦的設計使得其有更多的空間來放更多的UI組件,而多出來的空間存放UI使其會產生更多的交互,從而誕生了fragments 。
fragments 的設計不需要你來親自管理view hierarchy 的復雜變化,通過將Activity 的布局分散到frament 中,可以在運行時修改activity 的外觀,並且由activity 管理的back stack 中保存些變化。當一個片段指定了自身的布局時,它能和其他片段配置成不同的組合,在活動中為不同的屏幕尺寸修改布局配置(小屏幕可能每次顯示一個片段,而大屏幕則可以顯示兩個或更多)。
Fragment必須被寫成可重用的模塊。因為fragment有自己的layout,自己進行事件響應,擁有自己的生命周期和行為,所以你可以在多個activity中包含同一個Fragment的不同實例。這對於讓你的界面在不同的屏幕尺寸下都能給用戶完美的體驗尤其重要。
Fragment優點
Fragment可以使你能夠將activity分離成多個可重用的組件,每個都有它自己的生命周期和UI。
Fragment可以輕松得創建動態靈活的UI設計,可以適應於不同的屏幕尺寸。從手機到平板電腦。
Fragment是一個獨立的模塊,緊緊地與activity綁定在一起。可以運行中動態地移除、加入、交換等。
Fragment提供一個新的方式讓你在不同的安卓設備上統一你的UI。
Fragment 解決Activity間的切換不流暢,輕量切換。
Fragment 替代TabActivity做導航,性能更好。
Fragment 在4.2.版本中新增嵌套fragment使用方法,能夠生成更好的界面效果。
Fragment做局部內容更新更方便,原來為了到達這一點要把多個布局放到一個activity裡面,現在可以用多Fragment來代替,只有在需要的時候才載入Fragment,提高性能。
可以從startActivityForResult中接收到返回結果,但是View不能。
Fragment的生命周期
你可以把fragment看作是activity的模塊化組件,它擁有自己的生命周期
Fragment是activity的界面中的一部分或一種行為。你可以把多個Fragment們組合到一個activity中來創建一個多面界面並且你可以在多個activity中重用一個Fragment。你可以把Fragment認為模塊化的一段activity,它具有自己的生命周期,接收它自己的事件,並可以在activity運行時被添加或刪除。
Fragment不能獨立存在,它必須嵌入到activity中,而且Fragment的生命周期直接受所在的activity的影響。例如:當activity暫停時,它擁有的所有的Fragment們都暫停了,當activity銷毀時,它擁有的所有Fragment們都被銷毀。然而,當activity運行時(在onResume()之後,onPause()之前),你可以單獨地操作每個Fragment,比如添加或刪除它們。當你在執行上述針對Fragment的事務時,你可以將事務添加到一個棧中,這個棧被activity管理,棧中的每一條都是一個Fragment的一次事務。有了這個棧,就可以反向執行Fragment的事務,這樣就可以在Fragment級支持「返回」鍵(向後導航)。
顯示Fragment時(跟用戶交互)要調用的核心的生命周期方法如下:
1. 把Fragment對象跟Activity關聯時,調用onAttach(Activity)方法;
2. Fragment對象的初始創建時,調用onCreate(Bundle)方法;
3. onCreateView(LayoutInflater, ViewGroup, Bundle)方法用於創建和返回跟Fragment關聯的View對象;
4. onActivityCreate(Bundle)方法會告訴Fragment對象,它所依附的Activity對象已經完成了Activity.onCreate()方法的執行;
5. onStart()方法會讓Fragment對象顯示給用戶(在包含該Fragment對象的Activity被啟動後);
6. onResume()會讓Fragment對象跟用戶交互(在包含該Fragment對象的Activity被啟恢復後)。
Fragment對象不再使用時,要反向回調的方法:
1. 因為Fragment對象所依附的Activity對象被掛起,或者在Activity中正在執行一個修改Fragment對象的操作,而導致Fragment對象不再跟用戶交互時,系統會調用Fragment對象的onPause()方法;
2. 因為Fragment對象所依附的Activity對象被終止,或者再Activity中正在執行一個修改Fragment對象的操作,而導致Fragment對象不再顯示給用戶時,系統會調用Fragment對象的onStop()方法。
3. onDestroyView()方法用於清除跟Fragment中的View對象關聯的資源;
4. Fragment對象的狀態被最終清理完成之後,要調用onDestroy()方法;
5. 在Fragment對象不再跟它依附的Activity關聯的時候,onDetach()方法會立即被調用
❽ Android Fragment怎麼強制銷毀
只要從fragmentmanage里remove掉就會嘗試回收fragment,這個時候會找一下還有沒有別的地方引用了這個fragment,比如你有個靜態類或者有個Activity拿著這個fragment的實例引用,那就沒法回收的,只有沒有別的地方引用了,才會回收。
❾ android中Fragment的切換方法。
需要做的准備
新建一個android項目,主Activity命名為MainActivity
創建三個Fragment1 Fragment2 Fragment3
為三個Fragment創建三個布局文fragment1.xml、fragment2.xml、fragment3.xml
布局 activity_main.xm
fragment1.xml樣例
Fragment1樣例
另外的可以根據樣例進行修改
activity_main.xml內容
activity打開時需要顯示一個fragment,也就是需要先向容器中添加一個fragment
這是就能顯示第二個fragment了,那麼如何切換不同的fragment呢,切換的過程如下
開啟事務
調用事務的replace方法,將當前容器的fragment替換為新的fragment
提交事務
注意上圖紅框中的addToBackStack方法,很多人都不是很清楚這個方法的實際作用,說一下程序運行時候的現象你就明白了
初始化時顯示的是 fragment2
實踐1 :fragment2------點擊按鈕frag1-----按返回鍵--------退出應用
實踐2: fragment2-----點擊按鈕frag3 -----按返回鍵--------返回到fragment2
為啥會出現上面的情況,原因就是切換到fragment3時,調用了addToBackStack方法,這時會將fragment2先入棧,然後再切換到fragment3,按返回鍵的時候fragment3銷毀,fragment2出棧顯示,而切換到fragme1時沒有將fragme2入棧,所以fragment2就直接銷毀了,再按返回鍵就直接退出應用了
❿ Android中的Fragment嵌套Fragment
fragment沒有嵌套一說,通過fragment管理者add remove等操作可以來實現上面功能