簡體   English   中英

從靜態方法中調用抽象類內部的非靜態方法

[英]Call a non-static method inside an abstract class from a static method

我試圖檢測何時關閉或更改了InputMethodManager.showInputMethodPicker()調用的輸入法選擇器。 我在另一個問題中找到了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() {}; anonym InputMethodActivity anonym = new InputMethodActivity() {}; ,但這會導致錯誤“ 必須從抽象聲明類或在'InputMethodActivity'中實現抽象方法'onInputMethodPicked()'來聲明類 ”。 我以為它們已經被聲明為抽象了,所以我在這里快要結束了。

問題:

基本上,我想知道是否可以在靜態方法(例如public void onClick_TextView(View v){} pickInput()中運行pickInput() ,以及如何實現該方法。

抽象類只能繼承它,並為抽象方法(如onInputMethodPicked方法)在不同的派生類中編寫不同的實現,通過繼承,您可以使用MainActivity (子類)中InputMethodActivity (父類)的任何方法,如pickInput方法

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

   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM