2011-10-05 23 views
0

我對Android開發相當陌生,所以如果我沒有提供所有您需要的信息,我很抱歉。基本上我正在構建一個基本的文件瀏覽器,但我想通過查看片段中所有文件的列表視圖來嘗試一些不同的內容。帶有列表視圖的片段應該不會替換列表?

這是我到目前爲止有:

在我的主要活動我有所有的目錄列表視圖,其具有調用stackAFragment它做到這一點的onclick事件:

public class Main extends Activity implements OnItemClickListener { 

    private File RootDir; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     /**Initialize the current directory when the main activity is created**/ 
     RootDir = new File("/sdcard/Docs/"); 
     Files_Main.setCurDir(RootDir); 

     ListView l = (ListView) findViewById(R.id.dir_list); 
     ArrayAdapter<String> directories = new ArrayAdapter<String>(getApplicationContext(), 
       android.R.layout.simple_list_item_1, 
       Files_Main.getFolderList(RootDir)); 

     l.setAdapter(directories); 
     l.setOnItemClickListener(this); 
     stackAFragment(RootDir.toString()); 
    } 

    /** 
    * Add a Fragment to our stack 
    */ 
    private void stackAFragment(String dir) { 
     File myFile = new File(dir); 
     Fragment f = new FilesFragment(); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.files_frag, f); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     ft.addToBackStack(null); 
     ft.commit(); 
    } 

我FilesFragment沒有按」它只是獲取當前目錄,我已經保存在一個數組列表中,並獲取該目錄中的所有文件,並在陣列適配器中使用該列表,如下所示:

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

     Context c = getActivity().getApplicationContext(); 
     File curDir = Files_Main.getCurDir(); 

     Toast.makeText(getActivity(), (curDir.toString()), Toast.LENGTH_SHORT).show(); 

     /** setup layouts **/ 
     LinearLayout main = new LinearLayout(c); 
     ListView list = new ListView(c); 

     /**Get a list of files from the current directory we are viewing**/ 
     String[] FilesList = Files_Main.getFileList(curDir); 

     /**put list into a array adapter**/ 
     ArrayAdapter<String> files = new ArrayAdapter<String>(getActivity(), 
       android.R.layout.simple_list_item_1, 
       FilesList); 

     /**Set list view to contain items from array adapter**/ 
     list.setAdapter(files); 
     list.setOnItemClickListener(this); 

     /**Attach the list view to the LinearLayout view**/ 
     main.addView(list); 

     /**Return LinearLayout View with list view as the fragment to display**/ 
     return main; 
    } 

但是由於某種原因,當我運行這個並進入另一個應該用另一個目錄重新調用stackAFragment的目錄時,它並不能代替我爲什麼不起作用的片段。我也使用了linearlayout,並使用按鈕而不是listview,它在你進入一個新目錄時工作並替換了片段。

任何人都可以幫忙嗎?謝謝,因爲我很困惑,爲什麼這不起作用。


public void onItemClick(AdapterView<?> parent, View view, int pos, long id) 
    { 
     File targetDir; 

     ListView l = (ListView) findViewById(R.id.dir_list); 
     if(parent.getItemAtPosition(pos).toString() == "...") 
     { 
      /** 
      * This is going up a directory by deleting the last entry of the directory arraylist. 
      * **/ 
      targetDir = Files.getPreviousDir(); 
      Files.setPreviousDir(); 
     } 
     else 
     { 
      /** 
      * Sets the item clicked on as the target directory we want to browse and adds it 
      * to the directory arraylist. 
      * **/ 
      targetDir = new File (Files.getCurDir() + "/" + 
        parent.getItemAtPosition(pos).toString()); 

      Files.setCurDir(targetDir); 
     } 

     ArrayAdapter<String> directories = new ArrayAdapter<String>(getApplicationContext(), 
       android.R.layout.simple_list_item_1, 
       Files.getFolderList(targetDir)); 

     l.setAdapter(directories); 
     l.setOnItemClickListener(this); 
     stackAFragment(targetDir.toString()); 
    } 
+0

你可以發佈你的onItemClick方法嗎? –

+0

按要求添加了onitemclick方法,謝謝。 –

+0

我已經設法解決我的問題在一個黑客的方式。我基本上發現layout.xml中的片段在加載應用程序時加載了片段類,但是將片段放在頂部。當片段替換被調用時,它並沒有取代視圖,而是創建了一個新的片段,它堆疊在開頭創建的片段後面。爲了解決這個問題,我創建了一個新的類,它是一個空的listfrgament,用於初始化應用程序中的片段,然後替換/添加可見的新片段。這是混亂的,所以如果有人知道更好的方式id appriciate它。 –

回答

0

我假設ID爲 「dir_list」 ListView控件是不是在一個片段,但只是在一個ViewGroup中與ID爲 「files_frag」 是這樣的...

<LinearLayout 
    android:id="@+id/files_frag" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ListView 
     android:id="@+id/dir_list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent/> 
</LinearLayout> 

如果是這樣,我想我知道你的問題。 ft.replace()只替換給定容器中的片段,而不是視圖。這是通過設計,爲什麼你的新解決方案工作,因爲實際上有一個片段要取代。

爲了減少「雜亂」,我會創建一個FoldersFragment並將ListView移動到其中,包括您正在Main.OnCreate()中執行的初始化。這將是非常相似的FilesFragment那麼片段加入到像這樣的XML ...

<LinearLayout 
    android:id="@+id/files_frag" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <fragment 
     android:name="com.mypackage.FoldersFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</LinearLayout> 

獎勵積分,再利用FilesFragments同時處理,你可以可能通過的文件結構的多層次遞歸向下鑽取: )

希望有幫助。