0

私のアプリケーションは、テキストファイルのリストで構成されています。ファイルをクリックすると、そのファイルがEditTextにロードされます。開いているファイルを保存するか、新しいファイルで作業しているかのように保存するオプションメニューを作成しました。私がやりたいのは「最初に保存」を表示することです。ユーザーが最初に開いているファイルを保存せずに新しいファイルを開こうとした場合の確認ダイアログ。

以下のコードでわかるように、最初にfalseとして初期化されたchangedというブール変数を作成しました。TextChangedListenerを使用してchangedをtrueに変更し、リストのファイルオープンコードのif/elseステートメントで処理しようとしています。私が抱えている問題は、ファイルを開いてから別のファイルを開こうとすると、[最初に保存]ダイアログが表示されますが、ファイルが変更されているかどうか、または[OK]をクリックするかキャンセルするかに関わらず、ファイルが開かないことです。他のファイル。

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);
        }

}

4

2 に答える 2

1

イベントが最初に呼び出され、直後にトリガーされるため、変数changeは常にtrueテキストが変更された場合になります。beforeTextChangedonTextChanged

beforeTextChanged(CharSequence s, int start, int count, int after) このメソッドは、s 内で start から始まる count 文字が after の長さの新しいテキストに置き換えられようとしていることを通知するために呼び出されます。

onTextChanged(CharSequence s, int start, int before, int count) このメソッドは、s 内で start から始まる count 文字が以前の長さの古いテキストを置き換えたことを通知するために呼び出されます。

ファイルを保存した後、変数を false にリセットする必要がありますchange

if(!changed){
    // open the file
 }else{
    changed = false;
    // show the alert and save the file
 }
于 2013-02-15T01:12:45.930 に答える