2011-10-05 4 views
0

저는 안드로이드 개발에 초보자입니다. 그래서 내가 필요한 모든 정보를 제공하지 못해서 미안합니다. 기본적으로 나는 기본적인 파일 브라우저를 만들었지 만 조각에있는 모든 파일의 목록보기를 사용하여 다른 것을 시도하려고했습니다.목록보기가있는 조각이 필요할 때 목록을 대체하지 않습니까?

을 내 주요 활동에서 나는이 작업을 수행하는 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은 '아무튼 모든 부분 정리를 할 때, arraylist에 저장 한 현재 디렉토리를 가져 와서 그 디렉토리의 모든 파일을 가져 와서 배열 어댑터의 목록을 사용합니다 :

@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를 다시 호출해야하는 다른 디렉토리로 이동하는 몇 가지 이유로 인해, 왜 이것이 작동하지 않는지 매우 혼란 스러울 조각을 대체하지 않습니다. 선형 레이아웃을 사용하고 listview 대신 버튼을 사용하여이 작업을 수행했습니다. 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의 조각이 응용 프로그램을로드 할 때 조각 클래스를로드했지만 해당 조각을 맨 위에 배치하고 있음을 발견했습니다. 프래그먼트 대체가 호출되었을 때 뷰를 대체하는 것이 아니라 시작 부분에 생성 된 새 프래그먼트를 쌓는 것이 었습니다. 이 문제를 해결하기 위해 새로운 클래스를 만들었습니다.이 클래스는 앱을 laoding 할 때 조각을 초기화하고 볼 수있는 새 조각을 바꾸거나 추가하는 빈 listfrgament입니다. 이것은 더러워서 누군가가 더 나은 방법을 알고 있다면 그것을 idricify. –

답변

0

나는 ... ID가 "dir_list"와 ListView에이 단편에 아니라, 그래서 같은 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를 만들고 현재 Main.OnCreate()에서 수행중인 초기화를 포함하여 ListView를이 폴더로 이동하십시오. 이 보너스 포인트

<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 다음 FilesFragment 그래서 같은 XML로 그 조각을 추가 할 아주 유사하다 당신은 아마도 파일 구조의 여러 레벨을 통해 반복적으로 드릴 다운 수 :)

도움이 되길 바랍니다.

관련 문제