2

我在处理片段时遇到问题。问题是:我的活动中有一个带有 ListView 的布局。当我在此 ListView 中选择一个项目时,实例化一个替换活动布局的片段。我的结果是片段和活动内容都显示在屏幕上,相互重叠。我能解决什么问题(片段只是替换活动内容)?这是代码:

活动布局.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>

活动.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();

      }
 }

片段布局.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>

片段.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;
     }

}
4

1 回答 1

3

FragmentTransaction.replace() 看起来它只替换了另一个片段(而不仅仅是任何视图),所以我很确定这是预期的行为(或者至少,我知道我以前遇到过这种情况)。我想你有几个选择:

  1. 我在您的代码中没有看到任何会使片段的背景不透明的内容。您可以先尝试一下,看看是否有帮助。如果是这样,那可能是最简单的。

  2. 您可以在执行事务的同时将其他项目的可见性设置为 View.GONE,但就 backstack 而言,这存在一些问题。

  3. 您可以将 ListView 和 TextView 替换为 ListFragment。这可能是“最好”的方法,但也可能是最多的工作。

于 2012-11-08T17:08:57.530 回答