Android開發工程師文集-Fragment,適配器,輪播圖,ScrollView,Gallery 圖片瀏覽器,Android經常使用佈局樣式java
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
事務android
add(),remove(),replace(),commit()數組
MyFragment2 fragment2=new MyFragment2(); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction beginTransaction = fragmentManager.beginTransaction(); beginTransaction.add(R.id.frame,fragement2); beginTransaction.commit();
fragment的生命週期瀏覽器
Createdapp
onAttach()->onCreate()->onCreateView()->onActivityCreated()
Startedide
onStart()
Resumed函數
onResume()
Paused佈局
onPause()
Stoppedthis
onStop()
Destroyedcode
onDestroyView()->onDestroy()->onDetach()
//當Fragment被添加到Activity的時候回調這個方法,而且只調用一次 @Override public void onAttach(Activity activity){ super.onAttach(activity); }
//建立Fragment時會回調,只調用一次 @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); }
//每次建立回調 @Override public View onCreateView(## ##){ }
//當Fragment所在的Activity啓動完成後調用 @Override public void onActivityCreated(Bundle savedInstanceState){ super.onActivityCreated(savedInstanceState); }
//啓動onStart() @Override public void onStart(){ super.onStart(); }
//onResume @Override public void onResume(){ super.onResume(); }
//onPause 暫停 @Override public void onPause(){ super.onPause(); }
//onStop 中止 @Override public void onStop(){ super.onStop(); }
//last
//onDestroyView @Override public void onDestroyView(){ super.onDestroyView(); }
//銷燬
//onDestroy @Override public void onDestroy(){ super.onDestroy(); }
重點
刪除Fragment
//onDetach
@Override public void onDetach(){ super.onDetach(); }
onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()
暫停Fragment - //暫停和中止的方法
onPause()->onStop()
從新看到Fragment
onStart()->onResume()
Fragment1 -> Fragment2
Fragment1: onPause()->onStop()->onDestroyView->onDestroy()->onDetach() Fragment2: onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()
Fragment2回到主界面時
onPause()->onStop()
又從新看見
//Fragment2回到界面 onStart()->onResume()
Fragment2 退出
onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()
public class MyFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater,ViewGrop container,Bundle savedInstanceState){ return super.onCreateView(inflater,container,savedInstanceState); //View view = inflater.inflate(R.layout.fragment, container, false); //TextView tv = view.findViewById(R.id.textview); //return view; } }
一個Activity調用Fragment的界面顯示數據內容
String text = editext.getText().toString(); MyFragment fragment = new MyFragment(); Bundle bundle = new Bundle(); bundle.putString("name",text); fragment.setArguments(bundle); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction beginTransaction = fragmentManager.beginTransaction(); //beginTransaction.add(containerViewId,fragment,tag) beginTransaction.add(R.id.layout.textview,fragment,"fragment"); beginTransaction.commit();
在Fragement中設置
public class MyFragment extends Fragment{ @0verride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View view = inflater.infate(R.layout.fragement,container,false); TextView tv=view.findViewById(R.id.textview); String text = getArguments().get("name")+""; tv.setText(text); } }
Fragment
private String name = "v"; public interface Myvoid { public void name(String name); }
Activity
implements Myvoid
fragment
@Override public void onAttach(Activity activity){ myvoid = activity; super.onAttach(activity); }
回到Activity
覆蓋方法
xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:orientation="vertical"> </LinearLayout>
Fragment
public class MyinfoFragment extends Fragment implements View.OnClickListener{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_myinfo, null); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public void onClick(View v) { } }
MainActivity
public class MainActivity extends FragmentActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setMain(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { } private void setMain() { } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); } private void setSelectStatus(int index) { switch (index){ } } private void initView() { } @Override public void onClick(View v) { switch (v.getId()){ } } }
FragmentManager fragmentManager = getFragmentManager(); Fragment findFragmentById = fragmentManager.findFragmentById(R.id.fragment);
<android.support.v4.view.ViewPager android:id="@+id/viewpager" android:... android:...> </android.support.v4.view.ViewPager>
ViewPager是一種容器,能夠盛裝兩種類型的對象:一種是View對象; 也能夠放置Fragment。
getLayoutInflater().form(this); getLayoutInflater().form(this).inflate(resource,root);
準備數據源 -> 準備適配器 ->加載適配器
List
PagerAdapter
ViewPager的聲明:<android.support.v4.view.ViewPager>
是爲了解決版本兼容性問題
咱們建立好佈局文件,而後在MainActivity中添加,進行實例
準備數據源
private List<View> viewList;
viewList = new ArrayList<View>();
顯示
View view = View.inflate(this, R.layout.view, null);
添加
viewList.add(view);
@Override public Object instantiateItem(ViewGroup container, int position){ }
搭建構造方法
public MyPagerAdapter(List<View> viewList){ this.viewList=viewList; }
container.addview(); return viewList.get(position);
container.removeView(viweList.get(position));
建立Adapter
PagerAdapter pagerAdapter = new PagerAdapter(viewList);
setAdapter(pagerAdapter);
PagerTabStrip和PagerTitleStrip
一個View顯示ViewPager,而後在ViewPager中添加PagerTabStrip <android.support.v4.view.ViewPager ... <android.support.v4.view.PagerTabStrip ...> </android.support.v4.view.PagerTabStrip> </android.support.v4.view.ViewPager>
而後加入標題,private List<String> titleList;
同理,ViewPager添加題目
titleList = new ArrayList<String>(); titleList.add("第一題"); titleList.add("第二題"); titleList.add("第三題"); titleList.add("第五題");
在加入PagerAdapter中,建立Adapter下建立,MyPagerAdapter.java
MyPagerAdapter.java
public class MyPagerAdapter extends PagerAdapter{ private List<View> viewList; private List<String> titleList; public MyPagerAdapter(List<View> viewList, List<String> titleList){ this.viewList=viewList; this.titleList=titleList; } }
加入題目數量第幾題
顯示標題
getPageTitle(),顯示所對應的標題
@Override public CharSequence getPageTitle(int position){ //return super.getPageTitle(position); return titleList.get(position); }
PagerTabStrip的屬性
背景
setBackgroundColor(Color.RED);
文本
setTextColor();
下劃線
setDrawFullUnderline(false);
分割線
setTabIndicatorColor();
FragmentPagerAdapter
import android.os.Bundle; import android.support.v4.app.Fragment; public class ExercisesFragment extends Fragment { private ListView lvList;//來源fragment private ListItemAdapter adapter; //適配器 private List<> ebl; //列表集合 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment, null); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); initData(); lvList = view.findViewById(R.id.lv_list); adapter = new ListItemAdapter(getActivity()); adapter.setData(ebl); lvList.setAdapter(adapter); } private void initData(){ ebl = new ArrayList<Bean>(); for (int i=0;i<10;i++){ Bean bean = new Bean(); bean.id=(i+1); switch (i){ case 0: case 9: default: break; } } } }
設置MyFragment繼承Fragment
public class MyFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ return inflater.infate(R.layout.view, container, false); //return inflater.infate(R.layout.view, null); } }
點擊跳轉Fragment
public void onClick(View v) { switch (v.getId()){ case R.id.bottom1: //getSupportFragmentManager().beginTransaction().add(R.id.main_body,new CFragment()).commit(); break; case R.id.bottom2: //getSupportFragmentManager().beginTransaction().add(R.id.main_body,new EFragment()).commit(); break; case R.id.bottom3: //getSupportFragmentManager().beginTransaction().add(R.id.main_body,new MFragment()).commit(); break; } }
實例
private List<Fragment> fragmentList;
Fragment做爲數據源
添加Fragment fragmentList = new ArrayList<Fragment>(); fragmentList.add(new Fragment()); 添加建立的Fragment //fragmentList.add(new Fragment%());
導入的包
import android.support.v4.app.Fragment;
若是用FragmentPagerAdapter,一次性加載
同理
public class MyFragment extends FragmentPagerAdapter{ private List<Fragment> fragmentList; private List<String> titleList; public MyFragment(FragmentManager fm,List<Fragment> fragmentList,List<String> titleList){ super(fm) this.fragmentList=fragmentList; this.titleList=titleList; } }
MainActivity.java
public class MainActivity extends FragmentActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } private void setMain() { } private void setSelectStatus(int index) { switch (index){ } } private void initView() { } @Override public void onClick(View v) { switch (v.getId()){ //getSupportFragmentManager().beginTransaction().add(R.id.main_body,new CourseFragment()).commit(); //getSupportFragmentManager().beginTransaction().add(R.id.main_body,new ExercisesFragment()).commit(); //getSupportFragmentManager().beginTransaction().add(R.id.main_body,new MyinfoFragment()).commit(); } } }
FragmentPagerAdapter adapter=new FragmentPagerAdapter(getSupportFragmentManager());
自動播放
靜態的方法導入:
<ViewFlipper android:id="@+id/flipper" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:flipInterval="4000"> <ImageView android:scaleType="matrix" android:id="@+id/ex2" android:layout_width="match_parent" android:layout_height="wrap_content"/> <ImageView android:scaleType="matrix" android:id="@+id/ex3" android:layout_width="match_parent" android:layout_height="wrap_content"/> <ImageView android:scaleType="matrix" android:id="@+id/ex4" android:android:layout_width="match_parent" android:layout_height="wrap_content"/> </ViewFlipper>
動態導入:
flipper = findViewById(R.id.flipper);
flipper.addView(getImageView(R.drawable.picture));
本身定義動態效果,通常用anim的文件夾表示:
而後建立佈局界面:
建立輪播圖
<ViewFlipper android:id="@+id/flipper" android:layout_width="match_parent" android:layout_height="match_parent"> </ViewFlipper>
MainActivity.java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
聲明變量
private ViewFlipper flipper;
進行初始化
flipper = findViewById(R.id.flipper);
動態導入:addView(getImageView(R.drawable.picture));
輪播圖有多張圖片,建立數組,分別導入
獲取圖片
private ImageView getImageView(int imageId){ ImageView image = new ImageView(this); image.setImageResource(imageId); return image; }
for(int i=0; i<imageId.length;i++){ flipper.addView(getImageView( 數組[i] )); }
手勢滑動的方法
@Override public boolean onTouchEvent(MotionEvent event){ return super.onTouchEvent(event); }
自動播放效果:
flipper.setFlipInterval(3000); flipper.startFlipping();
HorizontalScrollView,ScrollView
滾動視圖
不能滾動,由於佈局不是ScrollVeiw,而是<TextView>
tv.setText(getResources().getString(R.string.content));
若是是這樣就能夠
<ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" <TextView android:layout_width="match_parent" android:layout_height="wrap_content"/> </ScrollView>
setOnTouchListener的方法
scroll.setOnTouchListener(new OnTouchListener){ }
記得 scrollBy 和 scrollTo 的區別
Gallery像一個走廊,ImageSwitcher像幻燈片
顯示圖片,就要對圖片進行封裝,聲明數組
佈局 <Gallery android:... /> 老樣子
圖片id,private int[] res 定義數組
咱們學過的適配器,都是繼承BaseAdapter
ArrayAdapter<String> adapter; SimpleAdapter adapter;
public int getCount()
public long getItemId(int position)
public Object getItem(int position)
public View gtView(int position, View convertView, ViewGroup parent)
若是本身定義一個適配器,定義後,實現BaseAdapter中的方法,
而後建立構造函數
private int[] images; public ImageAdapter(int []images) { this.images = images; }
獲取視圖
private Context context; public ImageAdapter(int[] images, Context context){ this.images = images; this.context = context; }
public View gtView(int position, View convertView, ViewGroup parent)
{ //ImageView image=new ImageView(this); ImageView image = new ImageView(context); image.setBackgroundResource(數組[position]); //設置圖片大小 image.setLayoutParams(new Gallery.LayoutParams(400,300)); return image; }
加載適配器 MainActivity.java
聲明適配器: private ImageAdapter adapter;
初始化: adapter = new ImageAdapter(數組的變量名,上下文(this));
gallery.setAdapter(adapter);
無限制瀏覽
return Interger.MAX_VALUE;
setOnItemSelectedListener(this);
一樣
聲明 private ImageSwitcher is;
進行初始化 is = findViewById(R.id.is);
監聽器:gallery.setOnItemSelectedListener(this);
現實的接口:implements OnItemSelectedListener,ViewFactory
public View makeView(){ }
is.setFactory(this);
public View makeView(){ ImageView image = new ImageView(this); return image; }
setOnSeekBarChangeListener(this);
<SeekBar style="@android:style/Widget.SeekBar" />
<selecter xmlns:android="http...." <item android:android:state_pressed="true" android:state_window_focused="true" andeoid:drawable=""/>
線性佈局
LinearLayout
相對佈局
RelativeLayout
表格佈局
TableLayout
可使用GridView替代
絕對佈局
AbsoluteLayout
幀佈局(主要佈局疊加)
FrameLayout
多用LinearLayout和RelativeLayout
少用AbsoluteLayout
定位:分享 Android&Java 知識點