2011-10-18 133 views
5

我正在第一次使用3.0。 我想片段添加動態但其顯示的錯誤: -動態添加片段時出錯-java.lang.IllegalStateException:

10-18 18:29:11.215: ERROR/AndroidRuntime(3550): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

XML代碼

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/frags"> 

<ListView 
     android:id="@+id/number_list" 
     android:layout_width="250dip" 
     android:layout_height="match_parent" /> 

<FrameLayout 
     android:id="@+id/the_frag" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

活動

public class FragmentExampleActivity extends Activity implements 
    OnItemClickListener { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ListView l = (ListView) findViewById(R.id.number_list); 
    ArrayAdapter<String> numbers = new ArrayAdapter<String>(
      getApplicationContext(), android.R.layout.simple_list_item_1, 
      new String[] { "one", "two", "three", "four", "five", "six" }); 
    l.setAdapter(numbers); 
    l.setOnItemClickListener(this); 
} 

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

    Fragment f = new FragmentExample(); 

    FragmentTransaction ft = getFragmentManager().beginTransaction();  
    ft.replace(R.id.the_frag, f); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(null); 
    ft.commit(); 

} 
} 


public class FragmentExample extends Fragment { 
private int nAndroids=1; 

public FragmentExample() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saved) { 
    int n; 

    View l = inflater.inflate(R.layout.textlay,container); 
    TextView tv = (TextView) l.findViewById(R.id.textView1); 
    tv.setText("value "+nAndroids); 

    return l; 
} 

}

PLZ把一些光,我要去哪裏錯了:(

回答

19

而不是使用

View l = inflater.inflate(R.layout.textlay,container); 

你應該使用

View l = inflater.inflate(R.layout.textlay, container, false); 

或可替代

View l = inflater.inflate(R.layout.textlay, null); 

我強烈建議您使用,其中需要三個參數的版本inflate。 Android僅將該容器用於佈局的參數目的。通過false作爲第三個參數,可以防止添加textlaycontainer並修復您的問題

+0

Thankx it worked :) – voidRy

+0

但是我們是否通過了null? – voidRy

+2

該容器只能用於佈局參數。不在通貨膨脹期間。 – Spidy

3

或者您可以使用第三個參數並將其作爲false傳遞。

inflater.inflate(R.layout.sample_fragment, container,false); 

這意味着不要將當前視圖添加到根目錄。

4

如果onCreateView(),你想重用觀點,那麼你可以處理onDestroyView()

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    if (view != null) { 
     ViewGroup parentViewGroup = (ViewGroup) view.getParent(); 
     if (parentViewGroup != null) { 
      parentViewGroup.removeAllViews(); 
     } 
    } 
} 
0

下解決了多個問題:

public static View contentView; 

public static class MenuCardFrontFragment extends Fragment { 
    public MenuCardFrontFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     try 
     { 
      LinearLayout frontLayout = (LinearLayout)inflater.inflate(R.layout.content_card, container, false); 
      // modify layout if necessary 
      return contentView = frontLayout; 
     } catch (InflateException e) { 
      return contentView; 
     } 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     if (contentView != null) { 
      ViewGroup parentViewGroup = (ViewGroup) contentView.getParent(); 
      if (parentViewGroup != null) { 
       parentViewGroup.removeAllViews(); 
      } 
     } 
    } 
} 
  1. 如果片段表演動畫和用戶被迫在動畫結束之前重複動畫。例如:在菜單片段結束動畫並出現之前按兩次菜單按鈕。 (這得到了來自user2764384的onDestryView的解決)

  2. 如果通過指定容器來調用膨脹方法來獲取容器佈局。它看起來像是一個問題,因爲在第二次發生舊容器已經有一個視圖。所以如果發生這種異常,它將被捕獲並返回舊的視圖contentView。