2013-12-20 3 views
0

개체 ("jsonized"문자열)가 있으며이를 파일에 저장하고 싶습니다. 또한 사용자가 파일을 저장할 폴더를 선택할 수 있도록 대화 상자가 나타나기를 바랍니다. (갑자기 해결책이 나에게 타격을 주었을 때이 질문을 썼다. 더 나은 방법에 대한 의견을 얻기 위해 내 솔루션을 공유하는 것)android에 파일을 저장할 위치를 선택하십시오.

+1

코드. [codereview.se]에 대한 도움을받을 수 있습니다. –

답변

1

"파일 저장"버튼을 클릭하면 "selectFolder() "기능

Activity.java

public void selectFolder(){ 

    // Instantiate an AlertDialog.Builder with its constructor 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 

    // Chain together various setter methods to set the dialog characteristics 
    builder.setTitle("Choose folder to save profile"); 

    // Get the layout inflater 
    LayoutInflater inflater = this.getLayoutInflater(); 
    final View dialogView = inflater.inflate(R.layout.dialog_selectfolder, null); 

    ListView lvDirectories = (ListView) dialogView.findViewById(R.id.lvDirectories); 
    String path = Environment.getExternalStorageDirectory().toString(); 
    ((TextView) dialogView.findViewById(R.id.tvJamesBond)).setText(path); 

    final ArrayList<String> items = listFolders(path); 
    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items); 


    lvDirectories.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      String dest = ((ListView) dialogView.findViewById(R.id.lvDirectories)).getItemAtPosition(i).toString().trim(); 
      String path; 
      if(dest.compareTo("...")==0){ 
       int lastSlash = ((TextView) dialogView.findViewById(R.id.tvJamesBond)).getText().toString().lastIndexOf("/"); 
       path = ((TextView) dialogView.findViewById(R.id.tvJamesBond)).getText().toString().substring(0,lastSlash); 
      } 
      else{ 
       path = ((TextView) dialogView.findViewById(R.id.tvJamesBond)).getText().toString() + "/" + dest; 
      } 
      items.clear(); 
      items.addAll(listFolders(path)); 
      ((TextView) dialogView.findViewById(R.id.tvJamesBond)).setText(path); 
      adapter.notifyDataSetChanged(); 
     } 
    }); 

    lvDirectories.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
    builder.setView(dialogView); 

    // Add the buttons 
    builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      saveProfile(((TextView) dialogView.findViewById(R.id.tvJamesBond)).getText().toString()); 
     } 
    }); 

    builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      Toast toast = Toast.makeText(getApplicationContext(), "Nothing saved", Toast.LENGTH_SHORT); 
      toast.show(); 
     } 
    }); 

    // Get the AlertDialog from create() 
    AlertDialog dialog = builder.create(); 
    dialog.show(); 

} 

public ArrayList<String> listFolders(String path){ 
    ArrayList<String> result = new ArrayList<String>(); 
    File f = new File(path); 
    File[] files = f.listFiles(); 
    Log.d("TEST PATH1", path); 
    Log.d("TEST PATH1", Environment.getExternalStorageDirectory().toString()); 
    if(path.compareTo(Environment.getExternalStorageDirectory().toString())!=0){ 
     result.add("..."); 
    } 
    for (File inFile : files) { 
     if (inFile.isDirectory()) { 
      result.add(inFile.getName()); 
     } 
    } 

    return result; 
} 

public void saveProfile(String folder){ 

    String fileName = "default.txt"; 

    try{ 
     String ob = new Gson().toJson(((MyApplication)getApplication()).getProfile()); 
     OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(folder+"/"+fileName)); 
     outputStreamWriter.write(ob); 
     outputStreamWriter.close(); 
    } 
    catch(IOException ex){ 
     Log.e("SAVE_FILE", ex.toString()); 
    } 

    Toast toast = Toast.makeText(getApplicationContext(), "Profile saved to file '"+fileName+"'", Toast.LENGTH_SHORT); 
    toast.show(); 

} 

dialog_selectfolder.xml

이 질문은이 있나 니 이미 개선에 관한 것입니다 때문에 주제에서 벗어난 것으로 보인다
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/lvDirectories" 
     android:layout_gravity="center_horizontal" /> 

    <TextView 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:visibility="invisible" 
     android:text="New Text" 
     android:id="@+id/tvJamesBond" 
     android:layout_gravity="center_horizontal" /> 
</LinearLayout> 
관련 문제