2013-02-15 78 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