androidfragment實現
❶ android 在fragment里的怎樣實現滑動fragment
按照一般的思路,我們或許會這么做:首先,使用getActionBar()方法獲得操作欄,然後我們將操作欄的導航模式設置為Tab,並添加一些Tab,然後實現TabListener介面;其次,我們將多個布局通過Inflater()方法變成View,然後放到ViewPager裡面,並實現OnPageChangeListener介面就可以了。由此我們可以寫出下面的代碼:
package com.Android.AnyViewUI;
import java.util.ArrayList;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
public class MainActivity extends FragmentActivity implements TabListener,OnPageChangeListener {
private ActionBar mActionBar;
private ViewPager mViewPager;
private TabPagerAdapter mAdapter;
private ArrayList<View> mViews;
private ArrayList<ActionBar.Tab> mTabs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
//取得ActionBar
mActionBar=getActionBar();
//以Tab方式導航
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//禁用ActionBar標題
mActionBar.setDisplayShowTitleEnabled(false);
//禁用ActionBar圖標
mActionBar.setDisplayUseLogoEnabled(false);
//禁用ActionBar返回鍵
mActionBar.setDisplayShowHomeEnabled(false);
//添加Tabs
mTabs=new ArrayList<ActionBar.Tab>();
ActionBar.Tab tab0=mActionBar.newTab();
tab0.setText("界面一");
tab0.setTabListener(this);
mTabs.add(tab0);
mActionBar.addTab(tab0);
ActionBar.Tab tab1=mActionBar.newTab();
tab1.setText("界面二");
tab1.setTabListener(this);
mTabs.add(tab1);
mActionBar.addTab(tab1);
ActionBar.Tab tab2=mActionBar.newTab();
tab2.setText("界面三");
tab2.setTabListener(this);
mTabs.add(tab2);
mActionBar.addTab(tab2);
//獲取ViewPager
mViewPager=(ViewPager)findViewById(R.id.ViewPager);
//初始化mViews
mViews=new ArrayList<View>();
mViews.add(LayoutInflater.from(this).inflate(R.layout.layout_0, null));
mViews.add(LayoutInflater.from(this).inflate(R.layout.layout_1, null));
mViews.add(LayoutInflater.from(this).inflate(R.layout.layout_2, null));
//初始化mAdapter
mAdapter=new TabPagerAdapter(mViews);
mViewPager.setAdapter(mAdapter);
mViewPager.setOnPageChangeListener(this);
//默認顯示第二項
mViewPager.setCurrentItem(2);
}
@Override
public void onTabReselected(Tab mTab, FragmentTransaction arg1)
{
}
@Override
public void onTabSelected(Tab mTab, FragmentTransaction arg1)
{
if(mViewPager!=null)
{
mViewPager.setCurrentItem(mTab.getPosition());
}
}
@Override
public void onTabUnselected(Tab mTab, FragmentTransaction arg1)
{
}
@Override
public void onPageScrollStateChanged(int arg0)
{
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2)
{
}
@Override
public void onPageSelected(int Index)
{
//設置當前要顯示的View
mViewPager.setCurrentItem(Index);
//選中對應的Tab
mActionBar.selectTab(mTabs.get(Index));
}
}
其中,TabPagerAdapter是一個繼承自PagerAdapter的適配器類:
package com.Android.AnyViewUI;
import java.util.ArrayList;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
public class TabPagerAdapter extends PagerAdapter
{
private ArrayList<View> mViews;
public TabPagerAdapter(ArrayList<View> mViews)
{
this.mViews=mViews;
}
@Override
public void destroyItem(View container, int position, Object object)
{
((ViewPager)container).removeView(mViews.get(position));
}
@Override
public Object instantiateItem(View container, int position)
{
((ViewPager)container).addView(mViews.get(position), 0);
return mViews.get(position);
}
@Override
public int getCount()
{
return mViews.size();
}
@Override
public boolean isViewFromObject(View mView, Object mObject)
{
return (mView==mObject);
}
}
我們的代碼從邏輯上來講是沒有什麼問題的,但是當我們試圖運行這段代碼的時候,我們發現這段代碼出了問題,而問題就出在OnTabSelected()上。但是我們冷靜下來想了想,沒有錯啊,那麼問題到底出在哪裡呢?看到網上的朋友說,這里這個適配器應該繼承自FragmentPagerAdapter:
package com.Android.AnyViewUI;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class ViewPagerAdapter extends FragmentPagerAdapter {
//定義三個Fragment的索引
public static final int Fragment_Index_0=0;
public static final int Fragment_Index_1=1;
public static final int Fragment_Index_2=2;
public ViewPagerAdapter(FragmentManager fragmentManager)
{
super(fragmentManager);
}
@Override
public Fragment getItem(int Index)
{
Fragment mFragemnt=null;
switch(Index)
{
case Fragment_Index_0:
mFragemnt=new Fragment_0();
break;
case Fragment_Index_1:
mFragemnt=new Fragment_1();
break;
case Fragment_Index_2:
mFragemnt=new Fragment_2();
break;
}
return mFragemnt;
}
@Override
public int getCount()
{
return 3;
}
}
其中,Fragment_0、Fragment_1、Fragment_2是繼承自Fragment的類,由於三個布局基本一樣,這里只給出Fragment_0的代碼:
package com.Android.AnyViewUI;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Fragment_0 extends Fragment
{
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
View mView=inflater.inflate(R.layout.layout_0, container, false);
return mView;
}
}
❷ Android組件之Fragment(一)---基礎知識與運用
Fragment是Android3.0後引入的一個新的API,他出現的初衷是為了適應大屏幕的平板電腦, 當然現在他仍然是平板APP UI設計的寵兒,而且我們普通手機開發也會加入這個Fragment, 我們可以把他看成一個小型的Activity,又稱Activity片段!想想,如果一個很大的界面,我們 就一個布局,寫起界面來會有多麻煩,而且如果組件多的話是管理起來也很麻煩!而使用Fragment 我們可以把屏幕劃分成幾塊,然後進行分組,進行一個模塊化的管理!從而可以更加方便的在 運行過程中動態地更新Activity的用戶界面!另外Fragment並不能單獨使用,他需要嵌套在Activity 中使用,盡管他擁有自己的生命周期,但是還是會受到宿主Activity的生命周期的影響,比如Activity 被destory銷毀了,他也會跟著銷毀!
引用官方的一張圖片,其實已經說明問題了,就是為了更好的適配大屏,在大屏的時候,不需要去在一個activity內部通過復雜的布局和界面去實現,只需要去在一個activity內部,通過多個fragment來做界面布局實現即可,而且針對於多個fragment來說, 每個fragment有單獨的生命周期,
Demo樣例,我們在一個界面中,有上下兩個fragment,如圖所示:
Step 2: Fragment創建,視圖載入,數據賦值
BlankFragment .java
Step 3: Activity在onCreate( )方法中調用setContentView()之後調用FragmentTransaction 進行事務提交
FragmentTestActivity.java
在xml中聲明兩個fragment,指定為具體的fragment
Step 1:定義Fragment的布局,就是fragment顯示內容的
Step 2:自定義一個Fragment類,需要繼承Fragment或者他的子類,重寫onCreateView()方法 在該方法中調用:inflater.inflate()方法載入Fragment的布局文件,接著返回載入的view對象
BlankFragment.java
Step 3:在需要載入Fragment的Activity對應的布局文件中添加fragment的標簽, 記住,name屬性是全限定類名哦,就是要包含Fragment的包名,如:
Step 4: Activity在onCreate( )方法中調用setContentView()載入布局文件即可!
針對在一個Activity中的某個Layout中切換Fragment,,無非兩種方法:
我們自己看一下方法注釋
源碼方法注釋裡面說的很明白,這個方法會移除所有的fragment,然後添加當前的fragment。
這時分為兩種情況,一種是fragment已有並且在前台展示,一種是未有或者在後台,針對於前者,此時replace,生命周期不會發生變化,針對後者,生命周期會重新走
分為兩種情況,一種fragment已存在,一種未存在,針對於前者,生命周期無變化,但是會回調onHiddenChanged方法,針對於後者,生命周期會創建一次。
1.Fragment是Google官方引入的一個為了適配大屏、多頁面的一個組件。您可以理解為它就是一個類而已,只不過裡麵包含了View,並且與activity的生命周期進行了關聯。
2.動態載入與靜態載入相對來說,建議使用動態載入,靜態載入固定在了xml文件中,永遠不變。
3.replace的fragment如果不在前台,會執行所有生命周期,反之不會執行任何生命周期方法;hide+show生命周期並不會發生變化,但是會回調onHiddenChanged方法,在實際開發中,建議add之後,使用hide+show來操作fragment,一方面減少資源的重復載入和創建,另外一方面提升用戶體驗感。
4.fragment的生命周期大體上和activity一致,但是前期和後期多了一些東西,因為fragment內部有view,那麼這個view需要進行創建、然後添加到activity內部,所以相應的在onCreate與onStart之間就多了幾個方法-onCreateView、onViewCreated。相同的道理,fragment的view與activity解綁,也相應的在onStop與onDestory之間多個方法-onDestroyView。onAttach與onDetach可以理解為視圖與activity產生關聯和接觸關聯,是最開始和最後的步驟。
Demo地址
❸ android嵌套fragment怎麼實現點擊外層fragment控制內層fragment顯示特定界面
message是一個fragment,在裡面又有兩個子fragment,(Firends和follow),後來把兩個fragment改ViewPager方式進行切換,這時一定要注意msgAdapter=new FragmentMessagePagerAdapter(getChildFragmentManager());在new PagerAdapter時,一定要傳入getChildFragmentManager(),而不是getSupportFragmentManager,
一級Fragment里的OnCreateView方法:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mActivity = getActivity();
View view = inflater.inflate(R.layout.activity_fragment_message,container,false);
Button btnFriends= (Button) view.findViewById(R.id.btn_friends);
Button btnFollow= (Button) view.findViewById(R.id.btn_follow);
btnFriends.setOnClickListener(this);
btnFollow.setOnClickListener(this);
vp = (NoScrollViewPager) view.findViewById(R.id.vp_noscroll);
list_fragments=new ArrayList<Fragment>();
//把兩個子fragment實例化然後裝到集合里
mFrendsFragment=new Message_Friends_Fragment();
list_fragments.add(mFrendsFragment);
mFollowFragment=new Message_Follow_Fragment();
list_fragments.add(mFollowFragment);
msgAdapter=new FragmentMessagePagerAdapter(getChildFragmentManager());
❹ android fragment 怎麼實現
在fragment裡面寫一個回調函數 在activity裡面重載onkeydown方法,他接收到事件就回調fragment裡面的函數 這樣也可以穿事件過去啦。
❺ android fragment能做什麼
fragment的目的是適應眾多解析度,可以在不同屏幕上動態管理UI.可以將一個activty分成不同的區塊來現實,大屏小屏實現很好的兼容 。
Android是在Android 3.0 (API level 11)開始引入Fragment的。
可以把Fragment想成Activity中的模塊,這個模塊有自己的布局,有自己的生命周期,單獨處理自己的輸入,在Activity運行的時候可以載入或者移除Fragment模塊。
可以把Fragment設計成可以在多個Activity中復用的模塊。
當開發的應用程序同時適用於平板電腦和手機時,可以利用Fragment實現靈活的布局,改善用戶體驗。
❻ android fragment如何實現點擊事件嗎
可以在onCreateView里這樣做:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_a, container, false);
bt_right =(Button)v.findViewById(R.id.right);
bt_right.setOnClickListener(new OnClickListener(){
public void onClick(){
//加入想要的功能
}
});
return v;}
請確保:R.layout.fragment_a這個布局文件里有ID為right的Button
❼ 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 studio怎麼實現fragment
這跟AS沒有任何關系。在Eclipse及其他有android開發的IDE上都可以實現。實現步驟如下:
建立一個Fragment(代碼里創建)。這里邊主要是重寫那個返回值是View的方法,因為你要構造Fragment的界面。
將Fragment添加到界面中。主要通過事務管理類進行添加及替換Fragment(FragmentTransction ft =getFragmentManager().beginTransaction())
❾ android中Fragment能否實現下拉刷新
可以啊。下拉刷新跟actionbar沒有一毛錢的關系。
❿ android如何實現點擊出現不同頁面fragment
使用viewpage+ fragment 配合開發,可以實現 左右滑動 切換 fragment ,CSDN裡面有很多相關博客也有源碼,可以參考,我也是裡面下載,可以用的額
你問的是點擊按鈕的話,就更簡單了,
DetailFragmentdetailFragment=newDetailFragment();
=this.getFragmentManager()
.beginTransaction();
fragmentTransaction.replace(R.id.detail_one2,detailFragment);
fragmentTransaction.commit()
參考下