2012-11-08 74 views
2

我遇到了使用片段的問題。問題是:我的活動中有一個ListView的佈局。當我在此ListView中選擇一個項目時,實例化一個替換活動佈局的片段。我的結果是片段和活動內容都顯示在屏幕上,彼此重疊。我能解決什麼問題(片段只是替換活動內容)?這裏是代碼:覆蓋活動佈局的片段

activityLayout.xml

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

    <FrameLayout android:id="@+id/fragment_to_replace" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="visible" 
     android:orientation="vertical" 
     android:layout_gravity="center" > 

     <TextView android:id="@+id/textView" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:visibility="visible" 
      android:text="@string/textView_select_table" 
      android:textSize="30dp"/> 

     <ListView android:layout_marginTop="20dp" 
     android:layout_width="fill_parent" 
     android:layout_height="200dp" 
     android:id="@+id/listView" 
     android:visibility="visible" 
     android:paddingTop="40dp" /> 

    </FrameLayout> 

</LinearLayout> 

Activity.java

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity); 

    View view = findViewById(R.id.activity);  

    //Getting the ListView 
    ListView listView = (ListView) view.findViewById(R.id.listView); 
    listView.setTextFilterEnabled(true); 

    //Setting the adapter 
    listView.setAdapter(new Adapter(this)); 

    listView.setOnItemClickListener(new OnItemClickListener() { 

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

       //Creates a fragment 
       addFragment(); 
     } 

    }); 

} 

public void addFragment(){ 

    MyFragment newFragment; 

    FragmentTransaction newFragmentTransaction = getSupportFragmentManager().beginTransaction(); 

    newFragment = (MyFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.fragment); 

     if (newFragment == null){ 
       newFragment = new MyFragment(this, getSupportFragmentManager()); 
      newFragmentTransaction.replace(R.id.fragment_to_replace, 
       new SelectDrinkFragment(this, getSupportFragmentManager())); 
      newFragmentTransaction.addToBackStack(null); 
      newFragmentTransaction.commit(); 

     } 
} 

fragmentLayout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:visibility="visible" 
    android:text="@string/textView_two" 
    android:textSize="20dp"/> 

    <LinearLayout android:layout_marginTop="10dp" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:visibility="visible" 
     android:text="@string/textView" /> 

     <TextView android:id="@+id/textView_two" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:visibility="visible"/> 

    </LinearLayout> 

    <TextView 
     android:id="@+id/textView_three" 
     android:layout_marginTop="10dp" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:visibility="visible" 
     android:text="@string/textView_three"/> 

    <ListView 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:id="@+id/listView_two" 
    android:visibility="visible" 
    android:paddingTop="40dp" /> 

</LinearLayout> 

Fragment.java

public View onCreateView(final LayoutInflater inflater, final ViewGroup container,  Bundle saveInstanceState){ 


    View view = inflater.inflate(R.layout.fragment, container, false); 

    final ListView listView = (ListView) view.findViewById(R.id.listView_two); 

    CharSequence [] list = getResources().getStringArray(R.array.array); 

    listView.setAdapter(new ListAdapter(getContext(), list)); 

    return view; 

} 

ListAdapter.java

public class ListAdapter extends BaseAdapter{ 

     private Context context; 
     private CharSequence[] drinkArraySize; 

     public ListAdapter(Context context, CharSequence[] array){ 
      super(); 
      this.context = context; 
      this.array= array; 
     } 

     @Override 
     public int getCount() { 
     return array.length; 
     } 

     @Override 
     public Object getItem(int position) { 
     return null; 
     } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    public Context getContext(){ 
      return context; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     LinearLayout linearLayout = new LinearLayout(getContext()); 

     RadioButton radioButton = new RadioButton(getContext()); 
     radioButton.setText(array[position]); 

     linearLayout.addView(radioButton); 

     return linearLayout; 
    } 

} 

回答

3

FragmentTransaction.replace()看起來像只替換另一個片段(而不是任何視圖),所以我敢肯定這是預期的行爲(或者至少,我知道之前我曾遇到過這種情況)。我想你有幾個選擇:

  1. 我沒有在你的代碼中看到任何會使片段的背景不透明的東西。你可以先嚐試一下,看看它是否有幫助。如果是這樣,那可能是最簡單的。

  2. 您可以在執行交易的同時將其他項目的可見性設置爲View.GONE,但是就後臺堆棧而言,這存在一些問題。

  3. 您可以用ListFragment代替ListView和TextView。這可能是做「最好」的方式,但也可能是最多的工作。

+0

嗨@ajpolt,我試過這兩個第一選項。 ListFragment聽起來很有趣,我如何實現它?還有一個額外的信息,我正在使用庫ActionBarSherlock。實現ListFragment的問題是否是一個問題? – mari

+0

實現一個ListFragment與在Activity層完成一樣的過程。只需創建一個擴展ListFragment的類,重寫方法並像使用ListActivity一樣定義自定義視圖,然後將ListFragment包含在您的Activity中(它不需要是ListActivity,只是一個FragmentActivity),就像您將定期片段。請參閱http://developer.android.com/reference/android/app/ListFragment.html。 ActionBarSherlock應該不會影響您是否可以實現ListFragment。 – ajpolt