Вызов нестатического метода внутри абстрактного класса из статического метода - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь определить, когда средство выбора метода ввода, вызванное InputMethodManager.showInputMethodPicker(), закрыто или изменено.Я нашел возможное решение, предложенное Шерифом эль-Хатибом, в другом вопросе: Как я могу узнать, открыт ли или нет инструмент выбора метода ввода? .Его ответ предполагает, что ОП должен использовать абстрактный нестатический класс.Однако я не знаю, как вызвать метод из абстрактного класса в статическом методе.Я решил открыть здесь отдельный вопрос, потому что исходный вопрос уже старый и неактивный.

Вот решение, представленное Шерифом:

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() 'в' InputMethodActivity ' ".Я думал, что они оба уже объявлены абстрактными, поэтому я вот-вот подойду к концу своих веревок.

Проблема:

В основном, я хотел бы знать, еслиможно запустить pickInput() в статическом методе, таком как public void onClick_TextView(View v){}, и узнать, как этого достичь.

1 Ответ

0 голосов
/ 03 января 2019

абстрактный класс, вы можете наследовать его и писать разные реализации для абстрактного метода, такие как 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();
   }

   }
...