从静态方法中调用抽象类内部的非静态方法

时间:2019-01-03 06:24:52

标签: java android methods static abstract-class

我试图检测InputMethodManager.showInputMethodPicker()调用的输入法选择器是何时关闭或更改。我在另一个问题How can I tell if the input method picker is open or closed?中找到了Sherif elKhatib提出的可能解决方案。他的回答表明,OP应该使用抽象的非静态类。但是,我不知道如何在静态方法中从抽象类中调用方法。我以为我会在这里为此开一个单独的问题,因为原始问题已经很旧并且不活跃。

这是Sherif提出的解决方案:

public abstract class InputMethodActivity extends FragmentActivity {
    protected abstract void onInputMethodPicked();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mState = NONE;
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if(mState == PICKING) {
            mState = CHOSEN;
        }
        else if(mState == CHOSEN) {
            onInputMethodPicked();
        }
    }

    private static final int NONE = 0;
    private static final int PICKING = 1;
    private static final int CHOSEN = 2;
    private int mState;
    protected final void pickInput() {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showInputMethodPicker();
        mState = PICKING;
    }
}

我想调用的方法是pickInput(),以便从onInputMethodPicked()获得响应。

但是,从静态方法简单地调用pickInput();无效,甚至找不到。

此外,InputMethodActivity.pickInput();给出错误“ 不能从静态上下文中引用非静态方法'pickInput()'”。

接下来,我尝试实例化它,但是我发现摘要无法实例化:InputMethodActivity instant = new InputMethodActivity();给出错误“ 'InputMethodActivity'是抽象的;无法实例化”。

在进一步阅读之后,我尝试创建一个异常类:InputMethodActivity anonym = new InputMethodActivity() {};,但这产生了错误“类'从InputMethodActivity派生的匿名类”,必须被抽象声明或实现抽象方法'onInputMethodPicked( )”中的“ ”。我以为它们已经被声明为抽象了,所以我在这里快要结束了。

问题:

基本上,我想知道是否可以在静态方法(例如pickInput())中运行public void onClick_TextView(View v){},以及如何实现。

1 个答案:

答案 0 :(得分:0)

抽象类,您只能继承它,并为不同派生类中的onInputMethodPicked方法之类的抽象方法编写不同的实现 通过继承,您可以使用InputMethodActivity(父类)中的任何方法 MainActivity(子类),类似于pickInput方法

   public class MainActivity extends InputMethodActivity implements     View.OnTouchListener {
     @Override
     protected  void onInputMethodPicked(){
     // your implemetion after pick 
    }
    @Override
    public void onClick(View view) {
     pickInput();
   }

   }