我试图检测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){}
,以及如何实现。
答案 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();
}
}