【问题标题】:How to properly terminate an activity from a custom view class?如何从自定义视图类中正确终止活动?
【发布时间】:2020-08-12 17:23:23
【问题描述】:

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

如何访问宿主活动的activity 对象,以便从自定义视图类中调用其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;
    }
    
}

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

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

【问题讨论】:

    标签: java android android-edittext android-custom-view


    【解决方案1】:

    如果您知道主机,即显示自定义视图的活动,那么您可以执行类似的操作。

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

    java

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

    把它放在 try and catch 下

    编辑:创建一个您的 Host 活动实现的接口,并将其作为侦听器传递给您的自定义视图,然后在需要时调用它。

    例如

    interface CustomInputEditListener{
      public void onFinish();
    }
    

    在您的 Host 活动中实现这一点。

    MainActivity extends AppCompatActivity() implements CustomInputEditListener{
    
     //call this from onCreate()
      public void setHostListener(){
         suppressInputEditText.setHostEditListener(this);
      }
    
      @Override public void onFinish(){
          finish() ;
      }
    }
    

    在你的 SuppressInputEditText 类中创建一个这样的方法。

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

    当您需要调用完成时,只需调用

    hostListener.onFinish();
    

    【讨论】:

    • 我的错。应该提到我想保持班级独立。但感谢您的快速响应。 (我会更新问题。)
    【解决方案2】:

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

    科特林

    (context as? Activity)?.finish()
    

    Java

    ((Activity) context).finish()
    

    【讨论】:

    • 谢谢。我会使用 try / catch 来保持独立和功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    相关资源
    最近更新 更多