如何从自定义视图 class 中正确终止 activity?

How to properly terminate an activity from a custom view class?

类似于thispost。有一个自定义视图(扩展 EditText),如果用户按下 END 键,它必须能够调用父 activity 的 finish() 方法。

如何访问主机 activity 的 activity 对象,以便从自定义视图 class 中调用其 finish() 方法?

public class SuppressInputEditText extends androidx.appcompat.widget.AppCompatEditText {

    public SuppressInputEditText(Context context) {
        super(context);
    }

    public SuppressInputEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SuppressInputEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    
    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        return true;
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return true;
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        switch (keyCode){
            case 6: //end key
                //todo: call finish() method of parent activity.
                break;
        }
        return true;
    }
    
}

我可以使用我的 class 的 getContext() 方法,可用是因为它继承自 view,以获取上下文,但我不知道如何使用它来访问 finish() 方法。任何帮助或指点将不胜感激。

更新: 寻找可以保持 class 独立的解决方案。谢谢!

如果您知道主机,即显示自定义视图的 activity,那么您可以这样做。

(getContext() as? MainActivity)?.finish()

java

((MainActivity)getContext()).finish()

把它放在 try and catch 下

编辑:创建一个你的主机activity实现的接口,并将其作为监听器传递给你的自定义视图,然后在需要时调用它。

例如

interface CustomInputEditListener{
  public void onFinish();
}

在您的主机中 activity 执行此操作。

MainActivity extends AppCompatActivity() implements CustomInputEditListener{

 //call this from onCreate()
  public void setHostListener(){
     suppressInputEditText.setHostEditListener(this);
  }

  @Override public void onFinish(){
      finish() ;
  }
}

在您的 SuppressInputEditText class 中创建这样的方法。

public void setHostEditListener(CustomInputEditListener listener){
  this.hostListener = listener;
}

只要你需要调用 finish 就调用

hostListener.onFinish();

context 转换为 Activity 然后像下面这样调用 finish

科特林

(context as? Activity)?.finish()

Java

((Activity) context).finish()