2015-05-06 27 views
0

我的應用程序由左側的列表視圖組成,它充當菜單。通過點擊列表項目,我動態替換片段。目前,這隻適用於特定情況。如何在ListView上單擊動態替換片段?

看看我的回調方法,也就是負責更換:

public void onNavigationDrawerFragmentItemSelected(int position) { 

    switch(position) { 
     case 0: 
      if(!mTwoPanelsUsed) { 
       getFragmentManager().beginTransaction().replace(R.id.content_frame, mListFragment).addToBackStack(null).commit(); 
      } else { 
       findViewById(R.id.container_2).setVisibility(View.VISIBLE); 
       getFragmentManager().beginTransaction() 
         .replace(R.id.container_1, mListFragment) 
         .replace(R.id.container_2, mDetailsFragment) 
         .addToBackStack(null).commit(); 
      } 
      break; 
     case 1: 
      if(!mTwoPanelsUsed) { 
       getFragmentManager().beginTransaction().replace(R.id.content_frame, mRecordFragment).addToBackStack(null).commit(); 
      } else { 
       getFragmentManager().beginTransaction().replace(R.id.container_1, mRecordFragment).addToBackStack(null).commit(); 
       findViewById(R.id.container_2).setVisibility(View.INVISIBLE); 
      } 
      break; 
     case 2: 
      if(!mTwoPanelsUsed) { 
       getFragmentManager().beginTransaction().replace(R.id.content_frame, mSettingsFragment).addToBackStack(null).commit(); 
      } else { 
       getFragmentManager().beginTransaction().replace(R.id.container_1, mSettingsFragment).addToBackStack(null).commit(); 
       findViewById(R.id.container_2).setVisibility(View.GONE); 
      } 
      break; 
     case 3: 
      if(!mTwoPanelsUsed) { 
       getFragmentManager().beginTransaction().replace(R.id.content_frame, mAboutFragment).addToBackStack(null).commit(); 
      } else { 
       getFragmentManager().beginTransaction().replace(R.id.container_1, mAboutFragment).addToBackStack(null).commit(); 
       findViewById(R.id.container_2).setVisibility(View.GONE); 
      } 
      break; 
     default: 
      break; 
    } 

} 

一切工作正常,但情況下0。這一件作品只在第一次。在我更改爲另一個片段後,container_1的mListFragment不顯示。屏幕上只有一個白色字段。

這是我的佈局XML:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:baselineAligned="false" 
    android:divider="?android:attr/dividerHorizontal" 
    android:orientation="horizontal" 
    android:showDividers="middle" 
    android:id="@+id/recording_view" 
    tools:context=".RecordingListActivity"> 

    <!-- static drawer navigation --> 
    <fragment 
     android:id="@+id/navigation_drawer" 
     android:layout_width="180dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:name="com.iav.viraprecorder.NavigationDrawerFragment" 
     tools:layout="@layout/fragment_navigation_drawer"/> 

    <!-- dynamic content --> 
    <FrameLayout 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="2" 
     android:id="@+id/container_1"></FrameLayout> 

    <!-- dynamic content --> 
    <FrameLayout 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="3" 
     android:id="@+id/container_2"></FrameLayout> 

</LinearLayout> 

有人能告訴我,如何使該mListFragment再次可見?

謝謝!

編輯1: enter image description here

編輯2:

代碼 App Start

從訪問另一個之後回到第一個菜單項截圖:

從App開始截圖mListFragment別名RecordingListFragment:

package com.iav.viraprecorder; 

import android.app.Activity; 
import android.app.Fragment; 
import android.app.ListFragment; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 

import com.iav.viraprecorder.model.DummyData; 

public class RecordingListFragment extends ListFragment { 

    // log tag 
    private static final String TAG = RecordingListFragment.class.getName(); 

    private RecordingListFragmentCallbacks mRecordingListFragmentCallbacks = sDummyRecordingListFragmentCallbacks; 

    private ListView mListView; 

    private RecordingListAdapter mAdapter; 

    public RecordingListFragment() { 
    } 

    private static RecordingListFragmentCallbacks sDummyRecordingListFragmentCallbacks = new RecordingListFragmentCallbacks() { 
     @Override 
     public void onRecordingListFragmentItemSelected(String id) { 
     } 
    }; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     if (!(activity instanceof RecordingListFragmentCallbacks)) { 
      throw new IllegalStateException("Activity must implement fragment's callbacks."); 
     } 

     mRecordingListFragmentCallbacks = (RecordingListFragmentCallbacks) activity; 

    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     // Reset the active callbacks interface to the dummy implementation. 
     mRecordingListFragmentCallbacks = sDummyRecordingListFragmentCallbacks; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.fragment_recording_list, container, false); 

    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     mListView = getListView(); 
     mAdapter = new RecordingListAdapter(getActivity(), DummyData.getRecordingList()); 

     mListView.setAdapter(mAdapter); 

    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     mRecordingListFragmentCallbacks.onRecordingListFragmentItemSelected(
       DummyData.getRecordingList().get(position).getId()); 
    } 

    public interface RecordingListFragmentCallbacks { 
     public void onRecordingListFragmentItemSelected(String recordingId); 
    } 

} 
+0

要導航側抽屜嗎? – Roon13

+0

我已將左側的導航抽屜作爲菜單。在此旁邊,有一個「錄音」列表,旁邊是所選錄音的詳情視圖(情況0)。我想恢復放置在container_1(中間)的錄音列表。 – tellob

+1

如果你把截圖然後它將是非常有用的瞭解問題 – Roon13

回答

0

我不知道這是否有幫助,但我懷疑你會監督爲container1設置可見性。

case 0: 
     if(!mTwoPanelsUsed) { 
      getFragmentManager().beginTransaction().replace(R.id.content_frame, mListFragment).addToBackStack(null).commit(); 
     } else { 
      findViewById(R.id.container_2).setVisibility(View.VISIBLE); 
      findViewById(R.id.container_1).setVisibility(View.VISIBLE); 
      getFragmentManager().beginTransaction() 
        .replace(R.id.container_1, mListFragment) 
        .replace(R.id.container_2, mDetailsFragment) 
        .addToBackStack(null).commit(); 
     } 
     break; 

如果這不起作用,請讓我知道。

+0

這沒有奏效。 – tellob

+0

執行什麼?情況0的if循環或else循環? – dora

+0

在平板電腦上,其他部分得到執行。這就是我目前正在研究的重點。 – tellob