[英]Android - Trying to create a 'Save file first?" Dialog
我的应用程序由文本文件列表组成。 单击文件会将其加载到EditText中。 我创建了一个选项菜单来保存打开的文件,或者像处理新文件一样保存。 我要显示的是“首先保存”? 如果用户尝试打开一个新文件而不先保存打开的文件,则显示确认对话框。
正如您在下面的代码中看到的那样,我创建了一个布尔值变量,称为change,最初初始化为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);
}
}
如果文本发生更改,则变量change
将始终为true
,因为将首先调用beforeTextChanged
事件, onTextChanged
立即触发onTextChanged
事件。
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字符刚刚替换了之前具有长度的旧文本。
保存文件后,应将变量change
重置为false。
if(!changed){
// open the file
}else{
changed = false;
// show the alert and save the file
}
这里et.setText(new Scanner(file).useDelimiter("\\\\Z").next());
您更改文本。 此时,更改变为true
。
在EditText中加载测试后,需要将其设置回false
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.