Android中的回调
我对Android和整个编程都是新手,我需要一些回调方面的帮助。我理解回调的要点,但我不确定如何着手实施 上下文:我正在编写一个简单的记事本应用程序,允许用户编写文本并将其保存到应用程序中。然后,用户可以通过按钮请求读取文件。然后,文本将显示在主活动的文本视图中。有一个选项可以擦除此文件,这是通过确认弹出窗口完成的,这是另一个活动。此弹出窗口包含两个按钮,一个用于取消,一个用于擦除。如果文件不为空,它将擦除,如果为空,则不执行任何操作。我不确定这是否是实现它的最佳方式,但我想使用wipe按钮回调到主活动以清除textview。我想到的方法是使用回调函数返回一个布尔值。主活动将检查布尔值是否为真,如果为真,则清除textview。我不确定如何在弹出显示中实现回调以将此布尔值发送回主活动 主要活动的代码Android中的回调,android,callback,Android,Callback,我对Android和整个编程都是新手,我需要一些回调方面的帮助。我理解回调的要点,但我不确定如何着手实施 上下文:我正在编写一个简单的记事本应用程序,允许用户编写文本并将其保存到应用程序中。然后,用户可以通过按钮请求读取文件。然后,文本将显示在主活动的文本视图中。有一个选项可以擦除此文件,这是通过确认弹出窗口完成的,这是另一个活动。此弹出窗口包含两个按钮,一个用于取消,一个用于擦除。如果文件不为空,它将擦除,如果为空,则不执行任何操作。我不确定这是否是实现它的最佳方式,但我想使用wipe按钮回调
public class MainActivity extends AppCompatActivity implements Popout.ClearTextView {
Button bnRead,bnWrite,bnClear;
TextView tvFileOP;
EditText etInput;
// private static final String INPUT_CONTENT = "inputContent";
public static final String TV_CONTENT = "textViewContent";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bnRead = (Button) findViewById(R.id.bnRead);
bnWrite = (Button) findViewById(R.id.bnWrite);
bnClear = (Button) findViewById(R.id.bnClear);
tvFileOP = (TextView) findViewById(R.id.tvFileOP);
etInput = (EditText) findViewById(R.id.etInput);
tvFileOP.setMovementMethod(new ScrollingMovementMethod());
final String fileName = "test_file";
String data;
bnRead.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
FileInputStream fIn = openFileInput(fileName);
int c;
String temp = "";
while ( (c=fIn.read()) != -1){
temp = temp + Character.toString((char) c);
}
tvFileOP.setText(temp);
Toast.makeText(getBaseContext(),"file successfully read", Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
}
});
bnWrite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = etInput.getText().toString();
try {
FileOutputStream fOut = openFileOutput(fileName,MODE_APPEND);
fOut.write(data.getBytes());
fOut.close();
etInput.setText("");
Toast.makeText(getBaseContext(),"file successfully written", Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
}
});
bnClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,Popout.class));
}
});
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putString(TV_CONTENT,tvFileOP.getText().toString());
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
tvFileOP.setText(savedInstanceState.getString(TV_CONTENT));
}
@Override
public void clearTextView(Boolean clear) {
if (clear){
tvFileOP.setText("");
}
}
}
弹出确认菜单的代码
public class Popout extends AppCompatActivity {
Button bnClosepopup,bnWipe;
TextView tvConfirmation;
String fileName = "test_file";
TextView tvFileOP;
public interface ClearTextView {
public void clearTextView(Boolean clear);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.popupwindow);
bnClosepopup = (Button) findViewById(R.id.bnClosepopup);
bnWipe = (Button) findViewById(R.id.bnWipe);
tvConfirmation = (TextView) findViewById(R.id.tvConfirmation);
//HIDING THE TOOL BAR AT THE TOP OF THE SCREEN
this.getSupportActionBar().hide();
//GETTING THE SIZE OF THE SCREEN
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;
getWindow().setLayout((int) (width*0.8) , (int) (0.8*height));
bnClosepopup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
bnWipe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
File dir = getFilesDir();
File file = new File(dir, fileName);
boolean deleted = file.delete();
Toast.makeText(getBaseContext(),"file has been deleted",Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
finish();
}
});
}
}
我对android开发非常陌生,任何关于如何改进代码的提示都将不胜感激:)在这种情况下,无法将界面传递给其他活动,因为这是一种活动对活动的交流 您必须使用其他方法,有多种方法可供选择,我能想到的最佳方法是使用
startActivityForResult()
启动活动,然后等待响应返回,然后通过覆盖onActivityResult()
方法在MainActivity
中查询此响应:
示例
在main活动中
:
//on click of this button
bnClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,Popout.class);
int requestCode = 12; //it could be whatever you want
startActivityForResult(intent , requestCode);
}
});
//override this method
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//this is triggered when you finish the Popout Activity
if(requestCode == 12 && resultCode == Activity.RESULT_OK){
// get the boolean data returned from the Popout Activity
boolean deleted = data.getBooleanExtra("deleted_state" , false); //false is default if no value exists
}
}
bnWipe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
File dir = getFilesDir();
File file = new File(dir, fileName);
boolean deleted = file.delete();
//send the result to onActivtyResult() in MainActivity
Intent result = new Intent();
result.putExtra("deleted_state", deleted );
setResult(Activity.RESULT_OK, result);
Toast.makeText(getBaseContext(),"file has been deleted",Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
finish();
}
});
在弹出窗口中
活动:
//on click of this button
bnClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,Popout.class);
int requestCode = 12; //it could be whatever you want
startActivityForResult(intent , requestCode);
}
});
//override this method
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//this is triggered when you finish the Popout Activity
if(requestCode == 12 && resultCode == Activity.RESULT_OK){
// get the boolean data returned from the Popout Activity
boolean deleted = data.getBooleanExtra("deleted_state" , false); //false is default if no value exists
}
}
bnWipe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
File dir = getFilesDir();
File file = new File(dir, fileName);
boolean deleted = file.delete();
//send the result to onActivtyResult() in MainActivity
Intent result = new Intent();
result.putExtra("deleted_state", deleted );
setResult(Activity.RESULT_OK, result);
Toast.makeText(getBaseContext(),"file has been deleted",Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
finish();
}
});
更新:
//on click of this button
bnClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,Popout.class);
int requestCode = 12; //it could be whatever you want
startActivityForResult(intent , requestCode);
}
});
//override this method
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//this is triggered when you finish the Popout Activity
if(requestCode == 12 && resultCode == Activity.RESULT_OK){
// get the boolean data returned from the Popout Activity
boolean deleted = data.getBooleanExtra("deleted_state" , false); //false is default if no value exists
}
}
bnWipe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
File dir = getFilesDir();
File file = new File(dir, fileName);
boolean deleted = file.delete();
//send the result to onActivtyResult() in MainActivity
Intent result = new Intent();
result.putExtra("deleted_state", deleted );
setResult(Activity.RESULT_OK, result);
Toast.makeText(getBaseContext(),"file has been deleted",Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
finish();
}
});
它将是这样的:
// get the boolean data returned from the Popout Activity
boolean deleted = data.getBooleanExtra("deleted_state" , false);
if (deleted){
tvFileOP.setText("");
}
..........
就正确理解您的问题而言:您希望从活动中控制“擦除”按钮单击事件。以下是可能对您有所帮助的解决方案 1:为对话框类创建一个重写的构造函数 2:在dialog类中创建一个抽象方法。(说-onWipeButtonClick) 您还需要将对话框类抽象化 3:在“擦除”按钮的侦听器中单击,调用“擦除”按钮单击抽象方法 4:根据需要在主活动中创建dialog实例。编译器将给您一个错误,因为您尚未实现回调方法。 执行onWipeButtonClick方法,并对方法中的擦除数据执行必要的操作
public abstract class WipeDialog extends Dialog{
private Context context;
public WipeDialog(Context context){
this.context = context;
}
public abstract void onWipeButtonClick(boolean isTextEmpty);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.<XML_FILE>);
<initialization>
btnWipe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onWipeButtonClick(<YOUR_BOOLEAN_CHECK>);
}
});
}
}
希望这会有所帮助。
谢谢 非常感谢您的回复,但我想知道是否有更简单的方法来解决我的问题。是否有一种我不知道的更简单的方法来实现此功能?对于您的情况,此解决方案是为此类事情构建此方法的最推荐方法,是的,通过的
deleted
是您用来检查的。在看到此评论之前,我只是设法弄明白了。非常感谢你的帮助!如果这有助于接受答案,那么其他有同样问题的人就知道该去哪里找了,那就太好了。祝你好运。我不知道对话是一种东西,谢谢你把这件事告诉我。我会研究使用它们的!很高兴帮助你!:)