2013-03-05 99 views
-1

我有一個文件列表,當一個文件被點擊時,它的內容顯示在EditText中。該文件被設置爲currentFile。如果用戶在保存舊文件之前嘗試打開新文件,則會顯示一個保存對話框。對話框上的OK按鈕應該保存當前的工作文件,而是將其保存爲用戶試圖打開的文件。我的代碼中的問題在哪裏導致當前文件保存在試圖打開的新文件中。如何解決我的保存功能?

public boolean exists; 
     public File currentFile; 

@Override 
     public void onCreate(Bundle icicle) { 
       super.onCreate(icicle); 
       setContentView(R.layout.main); 
       et = (EditTextLineNumbers) findViewById(R.id.ide); 
       getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 
       File dir = new File(Environment.getExternalStorageDirectory() + "/My Webs"); 
       currentDirectory = dir; 

       et.addTextChangedListener(new TextWatcher() { 

        @Override 
        public void onTextChanged(CharSequence s, int start, int before, int count) { 

        } 

        @Override 
        public void beforeTextChanged(CharSequence s, int start, int count, 
          int after) { 
         changed = false; 
        } 

        @Override 
        public void afterTextChanged(Editable s) { 
         changed=true; 
        } 
       }); 
       changed=false; 
       if(dir.isDirectory()) { 
        browseToRoot(); 
       }else{ 
        dir.mkdir(); 
       } 
     } 

     private void openFile(File aFile){ 
      String nullChk = et.getText().toString(); 
      exists = true; 
      currentFile = aFile; 

     if(!changed || nullChk.matches("")){ 
      try { 
        et.setText(new Scanner(aFile).useDelimiter("\\Z").next()); 
        } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
        e.printStackTrace(); 
        } 
      }else{ 
       AlertDialog.Builder alert = new AlertDialog.Builder(this); 

       alert.setTitle("Save first?"); 
       alert.setMessage("(Will be saved in the current working directory)"); 

       alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
       String temptxt = et.getText().toString(); 

       if(exists){ 
        saveFile(currentFile.getPath(), temptxt); 
       }else{ 
        saveAs(); 
       } 
        } 
       }); 
       final File tempFile = aFile; 
       alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         try { 
          et.setText(new Scanner(tempFile).useDelimiter("\\Z").next()); 
         } catch (FileNotFoundException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        changed=false; 
        } 
       }); 

       alert.show(); 
      } 
     } 

     private void saveFile(String sFileName, String sBody){ 
      //Toast.makeText(this, exists +"", Toast.LENGTH_SHORT).show(); 
      if (exists) { 
       try { 
        File tempfile = new File(sFileName); 
        FileWriter writer = new FileWriter(tempfile); 
        writer.write(sBody); 
        writer.flush(); 
        writer.close(); 
        changed=false; 
        Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show(); 
        return; 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      }else{ 
       Toast.makeText(this, "Save as", Toast.LENGTH_SHORT).show(); 
       saveAs(); 
      } 

     } 

     private void saveAs(){ 
      AlertDialog.Builder alert = new AlertDialog.Builder(this); 

      alert.setTitle("Save as"); 
      alert.setMessage("(Will be saved in the current working directory)"); 

      // Set an EditText view to get user input 
      final EditText input = new EditText(this); 
      alert.setView(input); 

      alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       String value = input.getText().toString(); 
       String tmpText = et.getText().toString(); 

       try { 
       File tempfile = new File(currentDirectory, value); 
       FileWriter writer = new FileWriter(tempfile); 
        writer.write(tmpText); 
        writer.flush(); 
        writer.close(); 
        changed=false; 
        //itla.notifyDataSetChanged(); 
        fill(currentDirectory.listFiles()); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 
       } 
      }); 

      alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 

      } 
      }); 
      alert.show(); 
     } 

     /** 
     * This function browses up one level 
     * according to the field: currentDirectory 
     */ 
     private void upOneLevel(){ 
       if(this.currentDirectory.getParent() != null && !this.currentDirectory.getPath().equals("/sdcard/My Webs")){ 
         this.browseTo(this.currentDirectory.getParentFile()); 
       }else{ 
        //Do nothing 
       } 

     } 

     private void browseTo(final File aDirectory){ 
       // On relative we display the full path in the title. 
       if(this.displayMode == DISPLAYMODE.RELATIVE) 
         this.setTitle(aDirectory.getAbsolutePath() + " :: " + 
             getString(R.string.app_name)); 
       if (aDirectory.isDirectory()){ 
         this.currentDirectory = aDirectory; 
         fill(aDirectory.listFiles()); 
       }else{ 
        openFile(aDirectory); 
        } 
       changed=false; 
        } 
     } 

     @Override 
     protected void onListItemClick(ListView l, View v, int position, long id) { 
       super.onListItemClick(l, v, position, id); 

       String selectedFileString = this.directoryEntries.get(position) 
           .getText(); 
       if (selectedFileString.equals(getString(R.string.current_dir))) { 
         // Refresh 
         this.browseTo(this.currentDirectory); 
       } else if (selectedFileString.equals(getString(R.string.up_one_level))) { 
         this.upOneLevel(); 
       } else { 
         File clickedFile = null; 
         switch (this.displayMode) { 
           case RELATIVE: 
             clickedFile = new File(this.currentDirectory 
                 .getAbsolutePath() 
                 + this.directoryEntries.get(position) 
                     .getText()); 
             break; 
           case ABSOLUTE: 
             clickedFile = new File(this.directoryEntries.get(
                 position).getText()); 
             break; 
         } 
         if (clickedFile != null) 
          currentFile=clickedFile; 
           this.browseTo(clickedFile); 
       } 
     } 
} 
+0

將您的代碼歸結到相關部分。而且,這聽起來微不足道(你正在加載新的文件名字符串太快)。我們**不**會去調試您的代碼! – 2013-03-05 22:47:55

+0

我不問任何人調試它。我已經經歷了4天。只是想要另一雙眼睛來看看我看過的東西。 – RapsFan1981 2013-03-05 22:51:55

+0

我看不到你在哪裏調用'openFile()'。你是否通過了你想要打開的新文件?它看起來像什麼都將保存的文件 – codeMagic 2013-03-05 22:53:33

回答

2

openFile()第三行:更改currentFile如果他想打開新文件之前保存currentFile之前有條件地詢問用戶。更改currentFile當您實際打開另一個文件時,而不是之前,並且即使意外也不會有此問題。

+0

就是這樣!謝謝。 – RapsFan1981 2013-03-06 00:11:58