中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
嵌套Fragment的使用及遇到The specified child already has a parent. You must call removeView()問(wèn)題的解決


嵌套Tab在Android應(yīng)用中用途廣泛,之前做過(guò)的一些東西都是運(yùn)用了TabActivity。但是由于在Android Developers中說(shuō)到了“TabActivity was deprecated in API level 13." ,并且建議大家使用Fragment。所以學(xué)習(xí)了嵌套Fragment的使用,參考了這個(gè)博客中的相關(guān)思路和代碼。


在Android Developers中對(duì)于Fragment中文版看這里)的描述:A Fragment represents a behaviors or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section of an activity, which has its own lifecycle, receives its own input events, and which you can add or remove while the activity is running. 
簡(jiǎn)單來(lái)說(shuō),F(xiàn)ragment就是被嵌入在Activity中用來(lái)表現(xiàn)UI的一個(gè)可模塊化和可重用的組件。Fragment在大屏幕設(shè)備中應(yīng)用可以非常廣泛,開(kāi)發(fā)者可以通過(guò)自己巧妙的設(shè)計(jì)讓UI更加靈活和美觀。


創(chuàng)建Fragment

創(chuàng)建Fragment,必須創(chuàng)建一個(gè)Fragment的子類(lèi)。

創(chuàng)建一個(gè)自己的Fragment,需要?jiǎng)?chuàng)建一個(gè)Fragment的子類(lèi)。Fragment的生命周期和Activity的生命周期類(lèi)似,它包含了很多與Activity類(lèi)似的回調(diào)函數(shù)。

[java] view plaincopy
  1. public void onCreate (Bundle savedInstanceState)  
創(chuàng)建fragment的時(shí)候調(diào)用onCreate()方法
[java] view plaincopy
  1. public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)  

在第一次繪制UI的時(shí)候系統(tǒng)調(diào)用該方法,為了繪制UI,返回一個(gè)fragment布局的根View


Fragment添加到Activity的方法

1.layout文件中聲明fragment

[plain] view plaincopy
  1. <FrameLayout  
  2.       android:id="@+id/fragment_container"  
  3.       android:layout_width="fill_parent"  
  4.       android:layout_height="0dip"  
  5.       android:layout_weight="1.0"  
  6.       android:background="#fffab3" >  
  7.   </FrameLayout>  

2.將一個(gè)fragment添加到viewgroup中,使用FragmentTransaction添加、替換或者刪除fragment。


[java] view plaincopy
  1. private void addFragmentToStack(Fragment fragment) {  
  2.         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();  
  3.         ft.replace(R.id.fragment_container, fragment);  
  4.         ft.commit();  
  5.     }  

Fragment生命周期


異常分析


關(guān)于解決 java.lang.IllegalStateException The specified child already has a parent. You must call removeView()的方法


在運(yùn)行調(diào)試的時(shí)候會(huì)發(fā)現(xiàn),在第二次點(diǎn)擊一個(gè)相同的tab的時(shí)候,會(huì)出現(xiàn)上述異常。

這個(gè)異常說(shuō)的是,這個(gè)特定的child view已經(jīng)存在一個(gè)parent view了,必須讓parent view調(diào)用removeView()方法。

經(jīng)過(guò)對(duì)fragment的生命周期的分析

運(yùn)行順序:點(diǎn)擊tab1,點(diǎn)擊tab2,再點(diǎn)擊tab1.

具體fragment的生命周期是:



對(duì)上圖進(jìn)行分析,可以發(fā)現(xiàn),出問(wèn)題的是viewpager中的view。當(dāng)切換不同的viewpager(即fragment,每個(gè)fragment中裝載了一個(gè)viewpager)時(shí),調(diào)用了startActivity()方法的時(shí)候,傳入了相同的id,會(huì)返回相同的對(duì)象。而當(dāng)我們?cè)诘诙握{(diào)用的時(shí)候,傳入了相同的id是復(fù)用了原來(lái)的view,這就導(dǎo)致了view被指定多個(gè)parent view

所以解決辦法就是,在使用這個(gè)view之前首先判斷其是否存在parent view,這調(diào)用getParent()方法可以實(shí)現(xiàn)。如果存在parent view,那么就調(diào)用removeAllViewsInLayout()方法。代碼如下:


[java] view plaincopy
  1. for (View view : viewList) {  
  2.             ViewGroup p = (ViewGroup) view.getParent();  
  3.             if (p != null) {  
  4.                 p.removeAllViewsInLayout();  
  5.             }  
  6.         }  

結(jié)果展示


完成之后在模擬器中運(yùn)行的效果如圖:




主要代碼


PS:完整工程點(diǎn)這里下載


TestFragmentActivity.java

[java] view plaincopy
  1. package com.test;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.annotation.SuppressLint;  
  6. import android.app.LocalActivityManager;  
  7. import android.content.Intent;  
  8. import android.os.Bundle;  
  9. import android.support.v4.app.Fragment;  
  10. import android.support.v4.app.FragmentActivity;  
  11. import android.support.v4.app.FragmentTransaction;  
  12. import android.support.v4.view.PagerAdapter;  
  13. import android.support.v4.view.ViewPager;  
  14. import android.util.Log;  
  15. import android.view.LayoutInflater;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import android.view.ViewGroup;  
  19. import android.view.Window;  
  20. import android.widget.LinearLayout;  
  21.   
  22. /** 
  23.  * 嵌套Fragment的使用 
  24.  *  
  25.  * @author zouliping 
  26.  *  
  27.  */  
  28. public class TestFragmentActivity extends FragmentActivity {  
  29.   
  30.     private LocalActivityManager manager;  
  31.   
  32.     private ArrayList<View> list1 = new ArrayList<View>();  
  33.     private ArrayList<View> list2 = new ArrayList<View>();  
  34.     private ArrayList<View> list3 = new ArrayList<View>();  
  35.   
  36.     private Fragment[] fragments;  
  37.   
  38.     @Override  
  39.     protected void onCreate(Bundle savedInstanceState) {  
  40.         super.onCreate(savedInstanceState);  
  41.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  42.         setContentView(R.layout.test_fragments);  
  43.   
  44.         manager = new LocalActivityManager(thisfalse);  
  45.         manager.dispatchCreate(savedInstanceState);  
  46.   
  47.         initViews();  
  48.     }  
  49.   
  50.     /** 
  51.      * 初始化Views 
  52.      */  
  53.     private void initViews() {  
  54.         findViewById(R.id.tv1).setOnClickListener(listener);  
  55.         findViewById(R.id.tv2).setOnClickListener(listener);  
  56.         findViewById(R.id.tv3).setOnClickListener(listener);  
  57.   
  58.         fragments = new FragmentParent[3];  
  59.         fragments[0] = FragmentParent.newInstance(list1, new String[] {  
  60.                 "page1_1""page1_2""page1_3" });  
  61.         fragments[1] = FragmentParent.newInstance(list2, new String[] {  
  62.                 "page2_1""page2_2""page2_3" });  
  63.         fragments[2] = FragmentParent.newInstance(list3, new String[] {  
  64.                 "page3_1""page3_2""page3_3" });  
  65.   
  66.         initPager();  
  67.   
  68.         findViewById(R.id.tv1).performClick();  
  69.     }  
  70.   
  71.     /** 
  72.      * 獲取view 
  73.      *  
  74.      * @param id 
  75.      * @param intent 
  76.      * @return 
  77.      */  
  78.     private View getView(String id, Intent intent) {  
  79.         return manager.startActivity(id, intent).getDecorView();  
  80.     }  
  81.   
  82.     /** 
  83.      * 根據(jù)parent position初始化viewPager 
  84.      */  
  85.     private void initPager() {  
  86.         Intent intent;  
  87.   
  88.         // tab1  
  89.         intent = new Intent(TestFragmentActivity.this, Test1Activity.class);  
  90.         list1.add(getView("tab1_1", intent));  
  91.         intent = new Intent(TestFragmentActivity.this, Test2Activity.class);  
  92.         list1.add(getView("tab1_2", intent));  
  93.         intent = new Intent(TestFragmentActivity.this, Test1Activity.class);  
  94.         list1.add(getView("tab1_3", intent));  
  95.   
  96.         // tab2  
  97.         intent = new Intent(TestFragmentActivity.this, Test1Activity.class);  
  98.         list2.add(getView("tab2_1", intent));  
  99.         intent = new Intent(TestFragmentActivity.this, Test2Activity.class);  
  100.         list2.add(getView("tab2_2", intent));  
  101.         intent = new Intent(TestFragmentActivity.this, Test1Activity.class);  
  102.         list2.add(getView("tab2_3", intent));  
  103.   
  104.         // tab3  
  105.         intent = new Intent(TestFragmentActivity.this, Test1Activity.class);  
  106.         list3.add(getView("tab2_1", intent));  
  107.         intent = new Intent(TestFragmentActivity.this, Test2Activity.class);  
  108.         list3.add(getView("tab2_2", intent));  
  109.         intent = new Intent(TestFragmentActivity.this, Test1Activity.class);  
  110.         list3.add(getView("tab2_3", intent));  
  111.     }  
  112.   
  113.     private OnClickListener listener = new OnClickListener() {  
  114.         @Override  
  115.         public void onClick(View v) {  
  116.             switch (v.getId()) {  
  117.             case R.id.tv1:  
  118.                 addFragmentToStack(fragments[0]);  
  119.                 break;  
  120.             case R.id.tv2:  
  121.                 addFragmentToStack(fragments[1]);  
  122.                 break;  
  123.             case R.id.tv3:  
  124.                 addFragmentToStack(fragments[2]);  
  125.                 break;  
  126.             }  
  127.   
  128.         }  
  129.     };  
  130.   
  131.     private void addFragmentToStack(Fragment fragment) {  
  132.         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();  
  133.         ft.replace(R.id.fragment_container, fragment);  
  134.         ft.commit();  
  135.     }  
  136.   
  137.     /** 
  138.      * 嵌套Fragment 
  139.      *  
  140.      */  
  141.     @SuppressLint("ValidFragment")  
  142.     public final static class FragmentParent extends Fragment {  
  143.   
  144.         /** 
  145.          * 工廠方法,返回一個(gè)新的FragmentParent的實(shí)例 
  146.          *  
  147.          * @param list 
  148.          * @param str 
  149.          * @return 
  150.          */  
  151.         public static final FragmentParent newInstance(ArrayList<View> list,  
  152.                 String[] str) {  
  153.             FragmentParent framentParent = new FragmentParent();  
  154.             Bundle bundle = new Bundle();  
  155.             bundle.putSerializable("pager_view_list", list);  
  156.             bundle.putStringArray("pager_title_ary", str);  
  157.             framentParent.setArguments(bundle);  
  158.             return framentParent;  
  159.         }  
  160.   
  161.         @Override  
  162.         public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  163.                 Bundle savedInstanceState) {  
  164.             Log.d("test fragment""fragment create view");  
  165.   
  166.             LinearLayout convertView = (LinearLayout) inflater.inflate(  
  167.                     R.layout.viewpager_fragments, container, false);  
  168.             ViewPager pager = (ViewPager) convertView.findViewById(R.id.pager);  
  169.   
  170.             @SuppressWarnings("unchecked")  
  171.             final ArrayList<View> viewList = (ArrayList<View>) getArguments()  
  172.                     .getSerializable("pager_view_list");  
  173.             final String[] titles = getArguments().getStringArray(  
  174.                     "pager_title_ary");  
  175.   
  176.             for (View view : viewList) {  
  177.                 ViewGroup p = (ViewGroup) view.getParent();  
  178.                 if (p != null) {  
  179.                     p.removeAllViewsInLayout();  
  180.                 }  
  181.             }  
  182.   
  183.             pager.setAdapter(new PagerAdapter() {  
  184.   
  185.                 @Override  
  186.                 public boolean isViewFromObject(View view, Object obj) {  
  187.                     return view == obj;  
  188.                 }  
  189.   
  190.                 @Override  
  191.                 public int getCount() {  
  192.                     return viewList.size();  
  193.                 }  
  194.   
  195.                 @Override  
  196.                 public void destroyItem(ViewGroup container, int position,  
  197.                         Object object) {  
  198.                     container.removeView(viewList.get(position));  
  199.                 }  
  200.   
  201.                 @Override  
  202.                 public CharSequence getPageTitle(int position) {  
  203.                     return titles[position];  
  204.                 }  
  205.   
  206.                 @Override  
  207.                 public Object instantiateItem(ViewGroup container, int position) {  
  208.                     container.addView(viewList.get(position));  
  209.                     return viewList.get(position);  
  210.                 }  
  211.             });  
  212.   
  213.             return convertView;  
  214.         }  
  215.   
  216.         @Override  
  217.         public void onStart() {  
  218.             super.onStart();  
  219.             Log.d("test fragment""fregment start");  
  220.         }  
  221.   
  222.         @Override  
  223.         public void onStop() {  
  224.             super.onStop();  
  225.             Log.d("test fragment""fregment stop");  
  226.         }  
  227.   
  228.         @Override  
  229.         public void onResume() {  
  230.             super.onResume();  
  231.             Log.d("test fragment""fregment resume");  
  232.         }  
  233.   
  234.         @Override  
  235.         public void onDestroy() {  
  236.             super.onDestroy();  
  237.             Log.d("test fragment""fregment destroy");  
  238.         }  
  239.   
  240.         @Override  
  241.         public void onDetach() {  
  242.             super.onDetach();  
  243.             Log.d("test fragment""fregment detach");  
  244.         }  
  245.   
  246.     }  
  247. }  


布局文件 test_fragments.xml

[plain] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <FrameLayout  
  8.         android:id="@+id/fragment_container"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="0dip"  
  11.         android:layout_weight="1.0"  
  12.         android:background="#fffab3" >  
  13.     </FrameLayout>  
  14.   
  15.     <LinearLayout  
  16.         android:layout_width="fill_parent"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_gravity="bottom"  
  19.         android:background="@android:color/black"  
  20.         android:orientation="horizontal" >  
  21.   
  22.         <TextView  
  23.             android:id="@+id/tv1"  
  24.             android:layout_width="wrap_content"  
  25.             android:layout_height="wrap_content"  
  26.             android:layout_marginBottom="10dp"  
  27.             android:layout_marginLeft="10dp"  
  28.             android:layout_marginTop="10dp"  
  29.             android:text="tab1"  
  30.             android:textColor="#ffffff"  
  31.             android:textIsSelectable="true"  
  32.             android:textSize="25sp" />  
  33.   
  34.         <TextView  
  35.             android:id="@+id/tv2"  
  36.             android:layout_width="wrap_content"  
  37.             android:layout_height="wrap_content"  
  38.             android:layout_marginBottom="10dp"  
  39.             android:layout_marginLeft="15dp"  
  40.             android:layout_marginTop="10dp"  
  41.             android:text="tab2"  
  42.             android:textColor="#ffffff"  
  43.             android:textIsSelectable="true"  
  44.             android:textSize="25sp" />  
  45.   
  46.         <TextView  
  47.             android:id="@+id/tv3"  
  48.             android:layout_width="wrap_content"  
  49.             android:layout_height="wrap_content"  
  50.             android:layout_marginBottom="10dp"  
  51.             android:layout_marginLeft="15dp"  
  52.             android:layout_marginTop="10dp"  
  53.             android:text="tab3"  
  54.             android:textColor="#ffffff"  
  55.             android:textIsSelectable="true"  
  56.             android:textSize="25sp" />  
  57.     </LinearLayout>  
  58.   
  59. </LinearLayout> 
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Android UI 之 Tab類(lèi)型界面總結(jié)
android Fragments詳解七:fragement示例
5.2.2 Fragment實(shí)例精講
團(tuán)隊(duì)沖刺--第一階段(二)
使用Fragment完成Tab選項(xiàng)卡
Android應(yīng)用中使用ViewPager和ViewPager指示器來(lái)制作Tab標(biāo)簽
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服