2012-11-08 76 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