2013-02-15 54 views
0

我的應用程序包含一個文本文件列表,點擊一個文件將它加載到一個EditText中,我創建了一個選項菜單來保存打開的文件,或另存爲如果在新文件上工作,如果用戶試圖在不保存打開文件的情況下先打開一個新文件,則顯示「保存第一個?」確認對話框安卓系統 - 試圖創建一個'保存文件第一?'對話框

正如您在下面的代碼中看到的我創建了一個名爲changed的布爾變量,最初初始化爲false。我試圖使用TextChangedListener將其更改爲true,然後使用列表的文件打開代碼中的if/else語句處理它。我遇到的問題是一次我打開一個文件,然後嘗試打開另一個文件,它顯示「保存第一個」對話框,但不管文件是否更改或者是否我點擊確定或取消它將不會打開任何其他文件。

public class MainActivity extends ListActivity { 

private List<String> items = null; 
public File currentDir = null; 
public File currentFile = null; 
public EditTextLineNumbers et; // My EditText 
public boolean changed = false; 

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

     checkExternalStorage(); 
     File dir = new File(Environment.getExternalStorageDirectory() + "/My Webs"); 
     currentDir = dir; 
     et = (EditTextLineNumbers) findViewById(R.id.ide); 
     et.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       changed = true; 
      } 

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

      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       // TODO Auto-generated method stub 

      } 
     }); 
     if(dir.isDirectory()) { 
      getFiles(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/My Webs").listFiles()); 
     }else{ 
      dir.mkdir(); 
     } 
    } 

    @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      MenuInflater inflater = getMenuInflater(); 
      inflater.inflate(R.menu.menu, menu); 
      return true; 
     } 

    @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      if(item.getItemId()== R.id.newsite){ 
       Log.d("New Site","New Site was clicked"); 
      }else if(item.getItemId()== R.id.newfile){ 
       Log.d("New File","New File was clicked"); 
      }else if(item.getItemId()== R.id.savefile){ 
       String temptxt = et.getText().toString(); 

       if(currentFile!=null){ 
        Log.d(currentFile.getAbsolutePath(),currentFile.getAbsolutePath()); 
        String tempfname = currentFile.toString(); 
        saveFile(tempfname, temptxt); 
       }else{ 
        saveFile(null, temptxt); 
       } 

      } 
      return super.onOptionsItemSelected(item); 
     } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id){ 
     int selectedRow = (int)id; 
     if(selectedRow == 0){ 
      getFiles(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/My Webs").listFiles()); 
     }else{ 
      File file = new File(items.get(selectedRow)); 
      if(file.isDirectory()){ 
       currentDir = file; 
       getFiles(file.listFiles()); 
      }else{ 
       currentFile = file; 
      if(changed==false){ 
       try { 
        et.setText(new Scanner(file).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 tmpText = et.getText().toString(); 

         try { 
         File tempfile = new File(currentDir, currentFile.toString()); 
         FileWriter writer = new FileWriter(tempfile); 
          writer.write(tmpText); 
          writer.flush(); 
          writer.close(); 

        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
         } 
        }); 

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

        alert.show(); 

       } 
      } 
      } 
     } 


    private void saveFile(String sFileName, String sBody){ 

     if (currentFile!=null) { 
      try { 
       File saveDir = new File("/"); 

       File tempfile = new File(saveDir, sFileName); 
       FileWriter writer = new FileWriter(tempfile); 
       writer.append(sBody); 
       writer.flush(); 
       writer.close(); 

       Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     }else{ 
      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(currentDir, value); 
      FileWriter writer = new FileWriter(tempfile); 
       writer.write(tmpText); 
       writer.flush(); 
       writer.close(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
      } 
     }); 

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

     alert.show(); 
    } 
     private void getFiles(File[] files){ 
      items = new ArrayList<String>(); 
      items.add(getString(R.string.goto_root)); 
      for(File file : files){ 
       String filename = file.getName().toString(); 
       String filenameArray[] = filename.split("\\."); 
       String extension = filenameArray[filenameArray.length-1]; 
       Log.d("Extension", extension); 
       items.add(file.getPath()); 
      } 
      ArrayAdapter<String> fileList = new ArrayAdapter<String>(this,R.layout.row_item, items); 
      setListAdapter(fileList); 
     } 

}

回答

1

你的變量change將永遠是true如果文本改變了,因爲事件beforeTextChanged將被稱爲第一右後onTextChanged將被觸發。

beforeTextChanged(CharSequence中,詮釋開始,詮釋計數,詮釋後) 這個方法被調用來通知您,S中,在啓動開始計數的字符即將用新的文本替換之後的長度。

onTextChanged(CharSequence中,詮釋開始,詮釋之前,詮釋計數) 這個方法被調用來通知您,S中,在啓動開始計數的字符剛剛取代了之前有長度舊文本。

你應該重置變量change假你保存文件

if(!changed){ 
    // open the file 
}else{ 
    changed = false; 
    // show the alert and save the file 
} 
0

這裏et.setText(new Scanner(file).useDelimiter("\\Z").next());您更改後的文字。此時,更改爲true

在EditText中加載測試後,您需要將它重新設置爲false