实例故障

时间:2016-10-05 10:48:38

标签: java android instance

目标是实现以下功能。三个EditText字段。每个都应该用自定义键盘填充。 1.英语 俄罗斯人 转录

我在这个类的帮助下实现的键盘

public class CustomKeyboard {

/** A link to the KeyboardView that is used to render this CustomKeyboard. */
private KeyboardView mKeyboardView;
/** A link to the activity that hosts the {@link #mKeyboardView}. */
private Activity     mHostActivity;

/** The key (code) handler. */
private OnKeyboardActionListener mOnKeyboardActionListener = new OnKeyboardActionListener() {

    public final static int CodeDelete   = -5; // Keyboard.KEYCODE_DELETE
    public final static int CodeCancel   = -3; // Keyboard.KEYCODE_CANCEL
    public final static int CodePrev     = 55000;
    public final static int CodeAllLeft  = 55001;
    public final static int CodeLeft     = 55002;
    public final static int CodeRight    = 55003;
    public final static int CodeAllRight = 55004;
    public final static int CodeNext     = 55005;
    public final static int CodeClear    = 55006;

    @Override public void onKey(int primaryCode, int[] keyCodes) {
        // NOTE We can say '<Key android:codes="49,50" ... >' in the xml file; all codes come in keyCodes, the first in this list in primaryCode
        // Get the EditText and its Editable
        View focusCurrent = mHostActivity.getWindow().getCurrentFocus();
        if( focusCurrent==null || focusCurrent.getClass()!=EditText.class ) return;
        EditText edittext = (EditText) focusCurrent;
        Editable editable = edittext.getText();
        int start = edittext.getSelectionStart();
        // Apply the key to the edittext
        if( primaryCode==CodeCancel ) {
            hideCustomKeyboard();
        } else if( primaryCode==CodeDelete ) {
            if( editable!=null && start>0 ) editable.delete(start - 1, start);
        } else if( primaryCode==CodeClear ) {
            if( editable!=null ) editable.clear();
        } else if( primaryCode==CodeLeft ) {
            if( start>0 ) edittext.setSelection(start - 1);
        } else if( primaryCode==CodeRight ) {
            if (start < edittext.length()) edittext.setSelection(start + 1);
        } else if( primaryCode==CodeAllLeft ) {
            edittext.setSelection(0);
        } else if( primaryCode==CodeAllRight ) {
            edittext.setSelection(edittext.length());
        } else if( primaryCode==CodePrev ) {
            View focusNew= edittext.focusSearch(View.FOCUS_BACKWARD);
            if( focusNew!=null ) focusNew.requestFocus();
        } else if( primaryCode==CodeNext ) {
            View focusNew= edittext.focusSearch(View.FOCUS_FORWARD);
            if( focusNew!=null ) focusNew.requestFocus();
        } else { // insert character
            editable.insert(start, Character.toString((char) primaryCode));
        }
    }

    @Override public void onPress(int arg0) {
    }

    @Override public void onRelease(int primaryCode) {
    }

    @Override public void onText(CharSequence text) {
    }

    @Override public void swipeDown() {
    }

    @Override public void swipeLeft() {
    }

    @Override public void swipeRight() {
    }

    @Override public void swipeUp() {
    }
};

/**
 * Create a custom keyboard, that uses the KeyboardView (with resource id <var>viewid</var>) of the <var>host</var> activity,
 * and load the keyboard layout from xml file <var>layoutid</var> (see {@link Keyboard} for description).
 * Note that the <var>host</var> activity must have a <var>KeyboardView</var> in its layout (typically aligned with the bottom of the activity).
 * Note that the keyboard layout xml file may include key codes for navigation; see the constants in this class for their values.
 * Note that to enable EditText's to use this custom keyboard, call the {@link #registerEditText(int)}.
 *
 * @param host The hosting activity.
 * @param viewid The id of the KeyboardView.
 * @param layoutid The id of the xml file containing the keyboard layout.
 */
public CustomKeyboard(Activity host, int viewid, int layoutid) {
    mHostActivity= host;
    mKeyboardView= (KeyboardView)mHostActivity.findViewById(viewid);
    mKeyboardView.setKeyboard(new Keyboard(mHostActivity, layoutid));
    mKeyboardView.setPreviewEnabled(false); // NOTE Do not show the preview balloons
    mKeyboardView.setOnKeyboardActionListener(mOnKeyboardActionListener);
    // Hide the standard keyboard initially
    mHostActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}

/** Returns whether the CustomKeyboard is visible. */
public boolean isCustomKeyboardVisible() {
    return mKeyboardView.getVisibility() == View.VISIBLE;
}

/** Make the CustomKeyboard visible, and hide the system keyboard for view v. */
public void showCustomKeyboard( View v ) {
    mKeyboardView.setVisibility(View.VISIBLE);
    mKeyboardView.setEnabled(true);
    if( v!=null ) ((InputMethodManager)mHostActivity.getSystemService(Activity.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0);
}

/** Make the CustomKeyboard invisible. */
public void hideCustomKeyboard() {
    mKeyboardView.setVisibility(View.GONE);
    mKeyboardView.setEnabled(false);
}

/**
 * Register <var>EditText<var> with resource id <var>resid</var> (on the hosting activity) for using this custom keyboard.
 *
 * @param resid The resource id of the EditText that registers to the custom keyboard.
 */
public void registerEditText(int resid) {
    // Find the EditText 'resid'
    //TextInputEditText edittext= (TextInputEditText)mHostActivity.findViewById(resid);
    EditText edittext= (EditText)mHostActivity.findViewById(resid);
    // Make the custom keyboard appear
    edittext.setOnFocusChangeListener(new OnFocusChangeListener() {
        // NOTE By setting the on focus listener, we can show the custom keyboard when the edit box gets focus, but also hide it when the edit box loses focus
        @Override public void onFocusChange(View v, boolean hasFocus) {
            if( hasFocus ) showCustomKeyboard(v); else hideCustomKeyboard();
        }
    });
    edittext.setOnClickListener(new OnClickListener() {
        // NOTE By setting the on click listener, we can show the custom keyboard again, by tapping on an edit box that already had focus (but that had the keyboard hidden).
        @Override public void onClick(View v) {
            showCustomKeyboard(v);
        }
    });
    // Disable standard keyboard hard way
    // NOTE There is also an easy way: 'edittext.setInputType(InputType.TYPE_NULL)' (but you will not have a cursor, and no 'edittext.setCursorVisible(true)' doesn't work )
    edittext.setOnTouchListener(new OnTouchListener() {
        @Override public boolean onTouch(View v, MotionEvent event) {
            EditText edittext = (EditText) v;
            int inType = edittext.getInputType();       // Backup the input type
            edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard
            edittext.onTouchEvent(event);               // Call native handler
            edittext.setInputType(inType);              // Restore input type
            return true; // Consume touch event
        }
    });
    // Disable spell check (hex strings look like words to Android)
    edittext.setInputType(edittext.getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
}

 }

和三种不同的xml-layouts

活动我创建三个键盘类副本。具有不同的布局。在他们的领域注册他们每个人。

public class WordsListActivity extends Activity {
public static final String LOG_TAG = "WordsListActivity";

protected RecyclerView mRecyclerView;
protected Button btnAddWord;
protected WordViewAdapter mAdapter;
protected RecyclerView.LayoutManager mLayoutManager;
protected WordsListActivity.LayoutManagerType mCurrentLayoutManagerType;

protected List<Word> wordsList;
protected int categoryId;
protected  CustomKeyboard mCustomKeyboardEN, mCustomKeyboardRU,  mCustomKeyboardTrancroption;


protected ForegroundLinearLayout addWordLyout;
protected Button okButton, cancelButton;
protected EditText etWordOrigin, etWordTranslate, etWordTranscription;



private enum LayoutManagerType {
    GRID_LAYOUT_MANAGER,
    LINEAR_LAYOUT_MANAGER
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_words_list);
    Intent intent = getIntent();
    categoryId = (int) intent.getLongExtra("categoryId",0);

    View rootView = getLayoutInflater().inflate(R.layout.content_main, null).getRootView();

    mRecyclerView = (RecyclerView)findViewById(R.id.wrodsRecyclerView);
    btnAddWord = (Button)findViewById(R.id.btnAddNewWord);
    mLayoutManager = new LinearLayoutManager(this);
    mCurrentLayoutManagerType = WordsListActivity.LayoutManagerType.LINEAR_LAYOUT_MANAGER;
    setRecyclerViewLayoutManager(mCurrentLayoutManagerType);

    addWordLyout  =(ForegroundLinearLayout)findViewById(R.id.inputWordLayout);

    addWordLyout.setVisibility(View.INVISIBLE);

    etWordOrigin = (EditText)findViewById(R.id.etWordOrigin);
    etWordTranslate = (EditText)findViewById(R.id.etWordTranslate);
    etWordTranscription = (EditText)findViewById(R.id.etWordTrancription);


    okButton = (Button) findViewById(R.id.addButton);
    cancelButton = (Button) findViewById(R.id.cancelButton);

    /* creting keybords*/
    mCustomKeyboardRU = new CustomKeyboard(this, R.id.keyboardviewWords, R.xml.kbd_ru);//russian
    mCustomKeyboardRU.registerEditText(R.id.etWordOrigin);

    mCustomKeyboardEN = new CustomKeyboard(this, R.id.keyboardviewWords, R.xml.kbd_en);//english
    mCustomKeyboardEN.registerEditText(R.id.etWordTranslate);


    /*in all EditText field showing this last keyboard copy*/
    mCustomKeyboardTrancroption = new CustomKeyboard(this, R.id.keyboardviewWords, R.xml.kbd_transcription);//transcription
    mCustomKeyboardTrancroption.registerEditText(R.id.etWordTrancription);

    btnAddWord.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            addWordLyout.setVisibility(View.VISIBLE);


        }
    });


}

@Override public void onBackPressed() {
    // NOTE Trap the back key: when the CustomKeyboard is still visible hide it, only when it is invisible, finish activity
    if( mCustomKeyboardRU.isCustomKeyboardVisible() ) mCustomKeyboardRU.hideCustomKeyboard(); else this.finish();

}
public void setRecyclerViewLayoutManager(WordsListActivity.LayoutManagerType layoutManagerType) {
/*
    mLayoutManager = new GridLayoutManager(this, SPAN_COUNT);
    mCurrentLayoutManagerType = LayoutManagerType.GRID_LAYOUT_MANAGER;*/
    mLayoutManager = new LinearLayoutManager(this);
    mCurrentLayoutManagerType = WordsListActivity.LayoutManagerType.LINEAR_LAYOUT_MANAGER;
    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.scrollToPosition(0);

    initDataset();

}


private void initDataset() {
    wordsList = new DataBase(this).getWordsList(categoryId);
    mAdapter = new WordViewAdapter(wordsList, this);
    mRecyclerView.setAdapter(mAdapter);

    if(wordsList.size()==0){
        Toast.makeText(this, "nothing to Show", Toast.LENGTH_LONG).show();
    }
}

}

但是当您运行专注于所有字段的应用程序时,它会显示最后一个键盘。在这种情况下转录。

0 个答案:

没有答案