आप एंड्रॉइड में एक कस्टम कीबोर्ड कैसे बना सकते हैं?


105

मैं एक कस्टम कीबोर्ड बनाना चाहता हूं। मुझे नहीं पता कि एक्सएमएल और जावा का उपयोग कैसे करना है। निम्नलिखित चित्र उस कीबोर्ड का एक मॉडल है जिसे मैं बनाना चाहता हूं। इसके लिए सिर्फ नंबर चाहिए।

यहां छवि विवरण दर्ज करें


6
[Android उपकरणों के लिए XML लेआउट का उपयोग करके अपना स्वयं का कस्टम कीबोर्ड बनाएं] ( ट्यूटोरियल्स-
android.blogspot.com/2011/06/…

1
Tuts में एक अच्छा ट्यूटोरियल है: लिंक
Hamed Ghadirian

Google के पास "SoftKeyboard" परियोजना का एक नमूना है, या यहां बहुत सारे संसाधन जुड़े हुए हैं: customkeyboarddetails.blogspot.com/2019/02/…
oliversisson

जवाबों:


83

सबसे पहले आपको एक keyboard.xmlफ़ाइल की आवश्यकता होगी जिसे res/xmlफ़ोल्डर में रखा जाएगा (यदि फ़ोल्डर मौजूद नहीं है, तो इसे बनाया गया है)।

<?xml version="1.0" encoding="utf-8"?> 
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="15%p"
    android:keyHeight="15%p" >

    <Row>
        <Key android:codes="1"    android:keyLabel="1" android:horizontalGap="4%p"/>
        <Key android:codes="2"    android:keyLabel="2" android:horizontalGap="4%p"/>
        <Key android:codes="3"    android:keyLabel="3" android:horizontalGap="4%p" />
        <Key android:codes="4"    android:keyLabel="4" android:horizontalGap="4%p" />
        <Key android:codes="5"    android:keyLabel="5" android:horizontalGap="4%p" />
    </Row>
    <Row>
        <Key android:codes="6"    android:keyLabel="6" android:horizontalGap="4%p"/>
        <Key android:codes="7"    android:keyLabel="7" android:horizontalGap="4%p"/>
        <Key android:codes="8"    android:keyLabel="8" android:horizontalGap="4%p" />
        <Key android:codes="9"    android:keyLabel="9" android:horizontalGap="4%p" />
        <Key android:codes="0"    android:keyLabel="0" android:horizontalGap="4%p" />
    </Row>

    <Row>
        <Key android:codes="-1"    android:keyIcon="@drawable/backspace" android:keyWidth="34%p" android:horizontalGap="4%p"/>
        <Key android:codes="100"    android:keyLabel="Enter" android:keyWidth="53%p" android:horizontalGap="4%p"/>
    </Row>
 </Keyboard>

** ध्यान दें कि आपको backspaceड्रॉएबल बनाना होगा और इसे रेस / ड्रॉबल-एलडीपीआई फ़ोल्डर में बहुत छोटे आकार (जैसे 18x18 पिक्सल) के साथ रखना होगा

फिर xml फ़ाइल में जिसे आप चाहते हैं कि इसका उपयोग किया जाए (जहां आपका टेक्स्ट व्यू है) में आपको निम्नलिखित कोड जोड़ना चाहिए:

<RelativeLayout
 ...
>

        .....


        <android.inputmethodservice.KeyboardView
             android:id="@+id/keyboardview"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
             android:focusable="true"
             android:focusableInTouchMode="true"
             android:visibility="gone" 
         />

        ......


</RelativeLayout>

** ध्यान दें कि जिस xml फ़ाइल को आप इसमें रखेंगे android.inputmethodservice.KeyboardView, उसे RelativeLayoutसेट करने में सक्षम होने के लिए होना चाहिए alignParentBottom="true"(आमतौर पर कीबोर्ड स्क्रीन के निचले भाग में प्रस्तुत किए जाते हैं)

फिर आपको उस onCreateफ़ंक्शन के फ़ंक्शन में निम्न कोड जोड़ना होगा Activityजो TextViewआप कीबोर्ड को संलग्न करना चाहते हैं

    // Create the Keyboard
    mKeyboard= new Keyboard(this,R.xml.keyboard);

    // Lookup the KeyboardView
    mKeyboardView= (KeyboardView)findViewById(R.id.keyboardview);
    // Attach the keyboard to the view
    mKeyboardView.setKeyboard( mKeyboard );

    // Do not show the preview balloons
    //mKeyboardView.setPreviewEnabled(false);

    // Install the key handler
    mKeyboardView.setOnKeyboardActionListener(mOnKeyboardActionListener);

** ध्यान दें कि mKeyboardऔर mKeyboardViewनिजी वर्ग चर हैं जिन्हें आपको बनाना है।

फिर आपको कीबोर्ड खोलने के लिए निम्न फ़ंक्शन की आवश्यकता होती है (आपको इसे onClickxml प्रॉपर्टी के माध्यम से TextView के साथ जोड़ना होगा )

    public void openKeyboard(View v)
    {
       mKeyboardView.setVisibility(View.VISIBLE);
       mKeyboardView.setEnabled(true);
       if( v!=null)((InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0);
    }

और आखिरकार आपको OnKeyboardActionListenerअपनी घटनाओं को संभालना होगा

private OnKeyboardActionListener mOnKeyboardActionListener = new OnKeyboardActionListener() {
    @Override public void onKey(int primaryCode, int[] keyCodes) 
    {
         //Here check the primaryCode to see which key is pressed 
         //based on the android:codes property
         if(primaryCode==1)
         {
            Log.i("Key","You just pressed 1 button");
         }
    }

    @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() {
    }
};

उम्मीद है की वो मदद करदे!!!

अधिकांश कोड यहां पाया गया


1
क्या होगा अगर मैं नहीं चाहता कि कीबोर्ड स्क्रीन के नीचे हो? (जैसे मैं चाहता हूं कि उपयोगकर्ता इसे चारों ओर खींचने में सक्षम हो)। क्या ऐसा कुछ है जिसे मैं अपने कीबोर्ड ऐप के माध्यम से नियंत्रित कर सकता हूं या यह एंड्रॉइड सिस्टम द्वारा नियंत्रित किया जाता है?
user3294126

कीबोर्ड की चौड़ाई स्क्रीन को नहीं भर रही है, मुझे इसे सभी स्क्रीन में भरने के लिए क्या करना चाहिए
जॉर्ज थॉमस

कीबोर्ड लेआउट में माता-पिता लेआउट क्या है? इसके अलावा क्या आपने कीबोर्ड व्यू का लेआउट_ एक्सपोजर जांचा है ??
पोंटियोस

1
कृपया ध्यान रखें कि कीबोर्ड और कीबोर्ड कक्षाएं एपीआई स्तर 29 के बाद से Google द्वारा अपदस्थ की जाती हैं। इसलिए यदि भविष्य में आपको नए एपीआई स्तर को लक्षित करना है तो यह समाधान भविष्य में काम नहीं करेगा।
Maex

कीबोर्डव्यू Google द्वारा पदावनत किया जाता है। नया समाधान क्या है?
तोहिद्महौदवंद ३५:३५

78

सिस्टम कीबोर्ड

यह उत्तर बताता है कि कस्टम सिस्टम कीबोर्ड कैसे बनाया जाता है जो किसी भी ऐप में उपयोग किया जा सकता है जो किसी उपयोगकर्ता ने अपने फोन पर स्थापित किया है। यदि आप एक ऐसा कीबोर्ड बनाना चाहते हैं जो केवल आपके ही ऐप के भीतर उपयोग किया जाएगा, तो मेरा दूसरा उत्तर देखें

नीचे दिए गए उदाहरण इस तरह दिखाई देंगे। आप इसे किसी भी कीबोर्ड लेआउट के लिए संशोधित कर सकते हैं।

यहां छवि विवरण दर्ज करें

निम्नलिखित चरण दिखाते हैं कि कैसे एक काम करने वाला कस्टम सिस्टम कीबोर्ड बनाया जाए। जितना संभव हो मैंने किसी भी अनावश्यक कोड को हटाने की कोशिश की। यदि ऐसी अन्य विशेषताएं हैं जिनकी आपको आवश्यकता है, तो मैंने अंत में अधिक सहायता के लिए लिंक प्रदान किए।

1. एक नया एंड्रॉइड प्रोजेक्ट शुरू करें

मैंने अपने प्रोजेक्ट का नाम "कस्टम कीबोर्ड" रखा। आप उसे जो चाहें कहें। यहां और कुछ खास नहीं है। मैं बस छोड़ दूंगा MainActivityऔर "हैलो वर्ल्ड!" लेआउट के रूप में यह है।

2. लेआउट फ़ाइलें जोड़ें

अपने ऐप के res/layoutफ़ोल्डर में निम्न दो फाइलें जोड़ें :

  • keyboard_view.xml
  • key_preview.xml

keyboard_view.xml

यह दृश्य एक कंटेनर की तरह है जो हमारे कीबोर्ड को रखेगा। इस उदाहरण में केवल एक कीबोर्ड है, लेकिन आप अन्य कीबोर्ड जोड़ सकते हैं और उन्हें इसमें से बाहर स्वैप कर सकते हैं KeyboardView

<?xml version="1.0" encoding="utf-8"?>
<android.inputmethodservice.KeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboard_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:keyPreviewLayout="@layout/key_preview"
    android:layout_alignParentBottom="true">

</android.inputmethodservice.KeyboardView>

key_preview.xml

कुंजी पूर्वावलोकन एक लेआउट है जो कीबोर्ड कुंजी दबाते ही पॉप अप हो जाता है। यह सिर्फ दिखाता है कि आप किस कुंजी को दबा रहे हैं (यदि आपकी बड़ी, मोटी उंगलियां इसे कवर कर रही हैं)। यह एक बहुविकल्पी पॉपअप नहीं है। उसके लिए आपको कैंडिडेट्स के दृष्टिकोण को देखना चाहिए ।

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:background="@android:color/white"
    android:textColor="@android:color/black"
    android:textSize="30sp">
</TextView>

3. समर्थन xml फ़ाइलें जोड़ें

xmlअपने resफोल्डर में एक फोल्डर बनाएं । (राइट क्लिक करें resऔर नई> निर्देशिका चुनें ।)

फिर इसमें निम्नलिखित दो xml फाइलें जोड़ें। ( xmlफ़ोल्डर पर राइट क्लिक करें और नया> XML संसाधन फ़ाइल चुनें ।)

  • number_pad.xml
  • method.xml

number_pad.xml

यह वह जगह है जहाँ यह अधिक दिलचस्प होने लगता है। यह चाबियोंKeyboard के लेआउट को परिभाषित करता है ।

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="20%p"
    android:horizontalGap="5dp"
    android:verticalGap="5dp"
    android:keyHeight="60dp">

    <Row>
        <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/>
        <Key android:codes="50" android:keyLabel="2"/>
        <Key android:codes="51" android:keyLabel="3"/>
        <Key android:codes="52" android:keyLabel="4"/>
        <Key android:codes="53" android:keyLabel="5" android:keyEdgeFlags="right"/>
    </Row>

    <Row>
        <Key android:codes="54" android:keyLabel="6" android:keyEdgeFlags="left"/>
        <Key android:codes="55" android:keyLabel="7"/>
        <Key android:codes="56" android:keyLabel="8"/>
        <Key android:codes="57" android:keyLabel="9"/>
        <Key android:codes="48" android:keyLabel="0" android:keyEdgeFlags="right"/>
    </Row>

    <Row>
        <Key android:codes="-5"
             android:keyLabel="DELETE"
             android:keyWidth="40%p"
             android:keyEdgeFlags="left"
             android:isRepeatable="true"/>
        <Key android:codes="10"
             android:keyLabel="ENTER"
             android:keyWidth="60%p"
             android:keyEdgeFlags="right"/>
    </Row>

</Keyboard>

यहाँ कुछ ध्यान देने योग्य बातें हैं:

  • keyWidth: यह प्रत्येक कुंजी की डिफ़ॉल्ट चौड़ाई है। इसका 20%pमतलब है कि प्रत्येक कुंजी को पी arent की चौड़ाई का 20% हिस्सा लेना चाहिए । यह व्यक्तिगत कुंजी द्वारा ओवरराइड किया जा सकता है, हालांकि, जैसा कि आप देख सकते हैं कि तीसरी पंक्ति में हटाएं और दर्ज करें कुंजी के साथ हुआ।
  • keyHeight: यहां हार्ड कोडित है, लेकिन आप @dimen/key_heightइसे अलग-अलग स्क्रीन आकारों के लिए गतिशील रूप से सेट करने के लिए कुछ का उपयोग कर सकते हैं।
  • Gap: क्षैतिज और ऊर्ध्वाधर अंतर बताता है कि चाबियों के बीच कितनी जगह छोड़नी है। यहां तक ​​कि अगर आप इसे सेट करते हैं 0pxतो भी एक छोटा सा अंतर है।
  • codes: यह एक यूनिकोड या कस्टम कोड मान हो सकता है जो निर्धारित करता है कि कुंजी दबाने पर क्या होता है या इनपुट क्या होता है। देखें keyOutputTextकि क्या आप एक लंबा यूनिकोड स्ट्रिंग इनपुट करना चाहते हैं।
  • keyLabel: यह वह पाठ है जो कुंजी पर प्रदर्शित होता है।
  • keyEdgeFlags: यह इंगित करता है कि कुंजी को किस किनारे पर संरेखित किया जाना चाहिए।
  • isRepeatable: यदि आप कुंजी को दबाए रखते हैं तो यह इनपुट को दोहराता रहेगा।

method.xml

यह फ़ाइल उस सिस्टम को बताती है जो इनपुट विधि उप-प्रकार उपलब्ध है। मैं यहां केवल एक न्यूनतम संस्करण शामिल कर रहा हूं।

<?xml version="1.0" encoding="utf-8"?>
<input-method
    xmlns:android="http://schemas.android.com/apk/res/android">

    <subtype
        android:imeSubtypeMode="keyboard"/>

</input-method>

4. कुंजी इनपुट को संभालने के लिए जावा कोड जोड़ें

एक नई जावा फ़ाइल बनाएँ। चलो इसे बुलाओ MyInputMethodService। यह फ़ाइल सब कुछ एक साथ जोड़ती है। यह कीबोर्ड से प्राप्त इनपुट को संभालता है और जो कुछ भी इसे प्राप्त कर रहा है उस पर भेजता है ( EditTextउदाहरण के लिए)।

public class MyInputMethodService extends InputMethodService implements KeyboardView.OnKeyboardActionListener {

    @Override
    public View onCreateInputView() {
        // get the KeyboardView and add our Keyboard layout to it
        KeyboardView keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view, null);
        Keyboard keyboard = new Keyboard(this, R.xml.number_pad);
        keyboardView.setKeyboard(keyboard);
        keyboardView.setOnKeyboardActionListener(this);
        return keyboardView;
    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {

        InputConnection ic = getCurrentInputConnection();
        if (ic == null) return;
        switch (primaryCode) {
            case Keyboard.KEYCODE_DELETE:
                CharSequence selectedText = ic.getSelectedText(0);
                if (TextUtils.isEmpty(selectedText)) {
                    // no selection, so delete previous character
                    ic.deleteSurroundingText(1, 0);
                } else {
                    // delete the selection
                    ic.commitText("", 1);
                }
                break;
            default:
                char code = (char) primaryCode;
                ic.commitText(String.valueOf(code), 1);
        }
    }

    @Override
    public void onPress(int primaryCode) { }

    @Override
    public void onRelease(int primaryCode) { }

    @Override
    public void onText(CharSequence text) { }

    @Override
    public void swipeLeft() { }

    @Override
    public void swipeRight() { }

    @Override
    public void swipeDown() { }

    @Override
    public void swipeUp() { }
}

टिप्पणियाँ:

  • OnKeyboardActionListenerकुंजीपटल इनपुट के लिए सुनता है। इस उदाहरण में उन सभी खाली तरीकों की भी आवश्यकता है।
  • वह InputConnectionहै जो किसी अन्य दृश्य की तरह इनपुट भेजने के लिए उपयोग किया जाता है EditText

5. प्रकट अद्यतन करें

मैंने इसे पहले की बजाय अंतिम रखा क्योंकि यह उन फाइलों को संदर्भित करता है जिन्हें हमने पहले ही ऊपर जोड़ा था। अपने कस्टम कीबोर्ड को सिस्टम कीबोर्ड के रूप में पंजीकृत करने के लिए, आपको serviceअपनी AndroidManifest.xml फ़ाइल में एक अनुभाग जोड़ना होगा । इसके applicationबाद सेक्शन में रखें activity

<manifest ...>
    <application ... >
        <activity ... >
            ...
        </activity>

        <service
            android:name=".MyInputMethodService"
            android:label="Keyboard Display Name"
            android:permission="android.permission.BIND_INPUT_METHOD">
            <intent-filter>
                <action android:name="android.view.InputMethod"/>
            </intent-filter>
            <meta-data
                android:name="android.view.im"
                android:resource="@xml/method"/>
        </service>

    </application>
</manifest>

बस! अब आपको अपना ऐप चलाने में सक्षम होना चाहिए। हालाँकि, जब तक आप अपने कीबोर्ड को सेटिंग में सक्षम नहीं करेंगे, तब तक आपको बहुत कुछ दिखाई नहीं देगा।

6. सेटिंग में कीबोर्ड को सक्षम करें

प्रत्येक उपयोगकर्ता जो आपके कीबोर्ड का उपयोग करना चाहता है, उसे एंड्रॉइड सेटिंग्स में सक्षम करना होगा। ऐसा करने के बारे में विस्तृत निर्देशों के लिए, निम्नलिखित लिंक देखें:

यहाँ एक सारांश है:

  • Android सेटिंग> भाषा और इनपुट> वर्तमान कीबोर्ड> कीबोर्ड चुनें।
  • आपको सूची में अपना कस्टम कीबोर्ड देखना चाहिए। इसे चालू करो।
  • वापस जाएं और वर्तमान कीबोर्ड फिर से चुनें। आपको सूची में अपना कस्टम कीबोर्ड देखना चाहिए। यह चुनें।

अब आपको अपने कीबोर्ड का उपयोग करने में सक्षम होना चाहिए जो आप एंड्रॉइड में टाइप कर सकते हैं।

आगे के अध्ययन

ऊपर दिया गया कीबोर्ड प्रयोग करने योग्य है, लेकिन एक ऐसा कीबोर्ड बनाने के लिए जिसे अन्य लोग आप का उपयोग करना चाहते हैं, संभवतः आपको अधिक कार्यक्षमता जोड़ना होगा। कैसे जानने के लिए नीचे दिए गए लिंक का अध्ययन करें।

चल रहा

मानक KeyboardViewकैसा दिखता है और कैसा व्यवहार करता है? मैं निश्चित रूप से नहीं। ऐसा लगता है कि Android 2.0 के बाद से इसे अपडेट नहीं किया गया है। Play Store में उन सभी कस्टम कीबोर्ड के बारे में कैसे? वे ऊपर बदसूरत कीबोर्ड की तरह कुछ भी नहीं दिखते हैं।

अच्छी खबर यह है कि आप अपने स्वयं के कीबोर्ड के रूप और व्यवहार को पूरी तरह से अनुकूलित कर सकते हैं। आपको निम्नलिखित चीजें करने की आवश्यकता होगी:

  1. अपने स्वयं के कस्टम कीबोर्ड दृश्य बनाएं जो उप-वर्ग बनाते हैं ViewGroup। आप इसे Buttonएस के साथ भर सकते हैं या यहां तक ​​कि अपने स्वयं के कस्टम कुंजी विचार भी कर सकते हैं जो उपवर्ग हैं View। यदि आप पॉपअप विचारों का उपयोग करते हैं, तो इस पर ध्यान दें
  2. अपने कीबोर्ड में एक कस्टम ईवेंट श्रोता इंटरफ़ेस जोड़ें । जैसी चीजों के लिए इसके तरीकों को बुलाओ onKeyClicked(String text)या onBackspace()
  3. आप को जोड़ने के लिए की जरूरत नहीं है keyboard_view.xml, key_preview.xmlया number_pad.xmlइसके बाद के संस्करण के बाद से इन मानक के लिए सभी कर रहे हैं वर्णित दिशाओं में KeyboardView। आप इन सभी UI पहलुओं को अपने कस्टम दृश्य में संभाल लेंगे।
  4. अपनी MyInputMethodServiceकक्षा में, अपने कीबोर्ड वर्ग में परिभाषित कस्टम कीबोर्ड श्रोता को लागू करें। यह उस स्थान पर है KeyboardView.OnKeyboardActionListener, जिसकी अब आवश्यकता नहीं है।
  5. अपनी MyInputMethodServiceकक्षा की onCreateInputView()विधि में, अपने कस्टम कीबोर्ड का एक उदाहरण बनाएँ और वापस लाएँ। कीबोर्ड के कस्टम श्रोता को सेट करना न भूलें this

35

इन-ऐप कीबोर्ड

यह उत्तर बताता है कि अपने ऐप के भीतर विशेष रूप से उपयोग करने के लिए एक कस्टम कीबोर्ड कैसे बनाया जाए। यदि आप एक सिस्टम कीबोर्ड बनाना चाहते हैं जो किसी भी ऐप में उपयोग किया जा सकता है, तो मेरा दूसरा उत्तर देखें

उदाहरण इस तरह दिखेगा। आप इसे किसी भी कीबोर्ड लेआउट के लिए संशोधित कर सकते हैं।

यहां छवि विवरण दर्ज करें

1. एक नया एंड्रॉइड प्रोजेक्ट शुरू करें

मैंने अपने प्रोजेक्ट का नाम रखा InAppKeyboard। जो चाहो बुला लो।

2. लेआउट फ़ाइलें जोड़ें

कीबोर्ड लेआउट

res/layoutफ़ोल्डर में एक लेआउट फ़ाइल जोड़ें । मैंने अपना फोन किया keyboard। कीबोर्ड एक कस्टम यौगिक दृश्य होगा जिसे हम इस xml लेआउट फ़ाइल से फुलाएंगे। आप कुंजियों को व्यवस्थित करने के लिए जो भी लेआउट पसंद करते हैं उसका उपयोग कर सकते हैं, लेकिन मैं एक का उपयोग कर रहा हूं LinearLayoutmergeटैग नोट करें।

रेस / लेआउट / keyboard.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/button_1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="1"/>

            <Button
                android:id="@+id/button_2"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="2"/>

            <Button
                android:id="@+id/button_3"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="3"/>

            <Button
                android:id="@+id/button_4"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="4"/>

            <Button
                android:id="@+id/button_5"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="5"/>

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/button_6"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="6"/>

            <Button
                android:id="@+id/button_7"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="7"/>

            <Button
                android:id="@+id/button_8"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="8"/>

            <Button
                android:id="@+id/button_9"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="9"/>

            <Button
                android:id="@+id/button_0"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="0"/>

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/button_delete"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="2"
                android:text="Delete"/>

            <Button
                android:id="@+id/button_enter"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="3"
                android:text="Enter"/>

        </LinearLayout>
    </LinearLayout>

</merge>

गतिविधि लेआउट

प्रदर्शन उद्देश्यों के लिए हमारी गतिविधि में एक एकल EditTextऔर कीबोर्ड सबसे नीचे है। मैंने अपने कस्टम कीबोर्ड दृश्य को कॉल किया MyKeyboard। (हम जल्द ही इस कोड को जोड़ देंगे ताकि अब के लिए त्रुटि को नजरअंदाज कर दें।) हमारे सभी कीबोर्ड कोड को एक दृश्य में रखने का लाभ यह है कि इससे किसी अन्य गतिविधि या ऐप में पुन: उपयोग करना आसान हो जाता है।

रेस / लेआउट / activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.inappkeyboard.MainActivity">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#c9c9f1"
        android:layout_margin="50dp"
        android:padding="5dp"
        android:layout_alignParentTop="true"/>

    <com.example.inappkeyboard.MyKeyboard
        android:id="@+id/keyboard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"/>

</RelativeLayout>

3. कीबोर्ड जावा फ़ाइल जोड़ें

एक नई जावा फ़ाइल जोड़ें। मैंने अपना फोन किया MyKeyboard

यहां ध्यान देने योग्य सबसे महत्वपूर्ण बात यह किसी भी करने के लिए कोई कठिन लिंक है कि वहाँ है EditTextया Activity। इससे उसे किसी भी ऐप या गतिविधि में प्लग करना आसान हो जाता है, जिसकी उसे आवश्यकता होती है। यह कस्टम कीबोर्ड दृश्य एक का भी उपयोग करता है InputConnection, जो सिस्टम कीबोर्ड के संचार के तरीके की नकल करता है EditText। इस प्रकार हम कड़ी से बचते हैं।

MyKeyboard एक यौगिक दृश्य है जो दृश्य लेआउट को बढ़ाता है जिसे हमने ऊपर परिभाषित किया है।

MyKeyboard.java

public class MyKeyboard extends LinearLayout implements View.OnClickListener {

    // constructors
    public MyKeyboard(Context context) {
        this(context, null, 0);
    }

    public MyKeyboard(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyKeyboard(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    // keyboard keys (buttons)
    private Button mButton1;
    private Button mButton2;
    private Button mButton3;
    private Button mButton4;
    private Button mButton5;
    private Button mButton6;
    private Button mButton7;
    private Button mButton8;
    private Button mButton9;
    private Button mButton0;
    private Button mButtonDelete;
    private Button mButtonEnter;

    // This will map the button resource id to the String value that we want to 
    // input when that button is clicked.
    SparseArray<String> keyValues = new SparseArray<>();

    // Our communication link to the EditText
    InputConnection inputConnection;

    private void init(Context context, AttributeSet attrs) {

        // initialize buttons
        LayoutInflater.from(context).inflate(R.layout.keyboard, this, true);
        mButton1 = (Button) findViewById(R.id.button_1);
        mButton2 = (Button) findViewById(R.id.button_2);
        mButton3 = (Button) findViewById(R.id.button_3);
        mButton4 = (Button) findViewById(R.id.button_4);
        mButton5 = (Button) findViewById(R.id.button_5);
        mButton6 = (Button) findViewById(R.id.button_6);
        mButton7 = (Button) findViewById(R.id.button_7);
        mButton8 = (Button) findViewById(R.id.button_8);
        mButton9 = (Button) findViewById(R.id.button_9);
        mButton0 = (Button) findViewById(R.id.button_0);
        mButtonDelete = (Button) findViewById(R.id.button_delete);
        mButtonEnter = (Button) findViewById(R.id.button_enter);

        // set button click listeners
        mButton1.setOnClickListener(this);
        mButton2.setOnClickListener(this);
        mButton3.setOnClickListener(this);
        mButton4.setOnClickListener(this);
        mButton5.setOnClickListener(this);
        mButton6.setOnClickListener(this);
        mButton7.setOnClickListener(this);
        mButton8.setOnClickListener(this);
        mButton9.setOnClickListener(this);
        mButton0.setOnClickListener(this);
        mButtonDelete.setOnClickListener(this);
        mButtonEnter.setOnClickListener(this);

        // map buttons IDs to input strings
        keyValues.put(R.id.button_1, "1");
        keyValues.put(R.id.button_2, "2");
        keyValues.put(R.id.button_3, "3");
        keyValues.put(R.id.button_4, "4");
        keyValues.put(R.id.button_5, "5");
        keyValues.put(R.id.button_6, "6");
        keyValues.put(R.id.button_7, "7");
        keyValues.put(R.id.button_8, "8");
        keyValues.put(R.id.button_9, "9");
        keyValues.put(R.id.button_0, "0");
        keyValues.put(R.id.button_enter, "\n");
    }

    @Override
    public void onClick(View v) {

        // do nothing if the InputConnection has not been set yet
        if (inputConnection == null) return;

        // Delete text or input key value
        // All communication goes through the InputConnection
        if (v.getId() == R.id.button_delete) {
            CharSequence selectedText = inputConnection.getSelectedText(0);
            if (TextUtils.isEmpty(selectedText)) {
                // no selection, so delete previous character
                inputConnection.deleteSurroundingText(1, 0);
            } else {
                // delete the selection
                inputConnection.commitText("", 1);
            }
        } else {
            String value = keyValues.get(v.getId());
            inputConnection.commitText(value, 1);
        }
    }

    // The activity (or some parent or controller) must give us 
    // a reference to the current EditText's InputConnection
    public void setInputConnection(InputConnection ic) {
        this.inputConnection = ic;
    }
}

4. कीबोर्ड को EditText पर इंगित करें

सिस्टम कीबोर्ड के लिए, एंड्रॉइड एक कीबोर्ड को फोकस करने के लिए एक इनपुटमेथोडमैनर का उपयोग करता है EditText। इस उदाहरण में, गतिविधि EditTextहमारे कस्टम कीबोर्ड से लिंक प्रदान करके इसकी जगह लेगी ।

चूंकि हम सिस्टम कीबोर्ड का उपयोग नहीं कर रहे हैं, इसलिए जब हम स्पर्श करते हैं, तो हमें इसे पॉप अप करने से रोकने के लिए इसे अक्षम करने की आवश्यकता होती है EditText। दूसरा, हम प्राप्त करने की आवश्यकता InputConnectionसे EditTextऔर यह हमारे कुंजीपटल करने के लिए दे।

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = (EditText) findViewById(R.id.editText);
        MyKeyboard keyboard = (MyKeyboard) findViewById(R.id.keyboard);

        // prevent system keyboard from appearing when EditText is tapped
        editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
        editText.setTextIsSelectable(true);

        // pass the InputConnection from the EditText to the keyboard
        InputConnection ic = editText.onCreateInputConnection(new EditorInfo());
        keyboard.setInputConnection(ic);
    }
}

यदि आपकी गतिविधि में कई EditTexts हैं, तो आपको InputConnectionकीबोर्ड पर सही EditText को पास करने के लिए कोड लिखना होगा । (आप एक जोड़ कर ऐसा कर सकते हैं OnFocusChangeListenerऔर OnClickListenerEditTexts करने के लिए। देखें इस लेख की एक चर्चा के लिए।) तुम भी छुपाना चाहते हैं या उचित समय पर अपने कीबोर्ड दिखा सकते हैं।

ख़त्म होना

बस। आप उदाहरण ऐप को अभी चला सकते हैं और वांछित रूप से इनपुट या टेक्स्ट हटा सकते हैं। आपका अगला कदम अपनी आवश्यकताओं को पूरा करने के लिए सब कुछ संशोधित करना है। उदाहरण के लिए, मेरे कुछ कीबोर्ड में मैंने बटन के बजाय टेक्स्टव्यू का उपयोग किया है क्योंकि उन्हें अनुकूलित करना आसान है।

टिप्पणियाँ

  • XML लेआउट फ़ाइल में, आप भी एक इस्तेमाल कर सकते हैं TextViewबल्कि एक Buttonआप कुंजी बेहतर बनाने के लिए चाहते हैं। फिर बस पृष्ठभूमि को एक आकर्षित करने योग्य बनाएं जो दबाने पर उपस्थिति स्थिति को बदल देता है।
  • उन्नत कस्टम कीबोर्ड: कीबोर्ड उपस्थिति और कीबोर्ड स्विचिंग में अधिक लचीलेपन के लिए, अब मैं कस्टम कुंजी विचार बना रहा हूं जो उप-वर्ग Viewऔर कस्टम कीबोर्ड हैं जो उपवर्ग ViewGroup। कीबोर्ड सभी चाबियों को प्रोग्रामेटिक रूप से देता है। कुंजियाँ कीबोर्ड के साथ संवाद करने के लिए एक इंटरफ़ेस का उपयोग करती हैं (इसी तरह कैसे टुकड़े किसी गतिविधि से संवाद करते हैं)। यह आवश्यक नहीं है अगर आपको केवल एक ही कीबोर्ड लेआउट की आवश्यकता है क्योंकि xml लेआउट उसके लिए ठीक काम करता है। लेकिन अगर आप क्या मैं पर काम कर रहा है का एक उदाहरण देखना चाहते हैं, सभी की जाँच Key*और Keyboard*कक्षाएं यहाँ । ध्यान दें कि मैं वहां एक कंटेनर दृश्य का उपयोग करता हूं जिसका कार्य कीबोर्ड में और बाहर स्वैप करना है।

आपका उत्तर बहुत अच्छा है, लेकिन हम मूल कीबोर्ड और इस नए कीबोर्ड के बीच कैसे टॉगल कर सकते हैं।
किशन डोंगा

@ किशनडोंगा, अपने कीबोर्ड पर आप कीबोर्ड स्विच करने के लिए एक कुंजी जोड़ सकते हैं। जब उपयोगकर्ता इसे दबाता है कॉल InputMethodManager#showInputMethodPicker()। यदि मूल कीबोर्ड में ऐसी कुंजी नहीं है, हालांकि, एकमात्र तरीका है जो उपयोगकर्ता आपके कीबोर्ड पर स्विच कर सकते हैं, इसे सिस्टम सेटिंग्स में मैन्युअल रूप से करना है। ऐप्पल इस क्षेत्र में एंड्रॉइड से बेहतर है, क्योंकि ऐप्पल को कीबोर्ड स्विचिंग कुंजी रखने के लिए सभी कीबोर्ड की आवश्यकता होती है।
सर्ग

@ किशनडोंगा, मुझे सिर्फ एहसास हुआ कि यह उत्तर इन-ऐप कीबोर्ड के बारे में है, न कि सिस्टम कीबोर्ड के बारे में। यदि आप दो कस्टम कीबोर्ड के बीच अदला-बदली करना चाहते हैं, तो आप प्रोग्राम को कंटेनर दृश्य में और बाहर स्वैप कर सकते हैं। बस दोनों कीबोर्ड पर एक स्वैप कीबोर्ड कुंजी जोड़ें। ऊपर दिए गए उत्तर में मेरे "उन्नत कस्टम कीबोर्ड" नोट और लिंक देखें।
सुरगाच

यदि आप अपने कीबोर्ड और सिस्टम कीबोर्ड के बीच स्वैप करना चाहते हैं, तो सिस्टम कीबोर्ड छिपाएं और उचित समय पर अपना कीबोर्ड दिखाएं (और इसके विपरीत)।
सूर्याग

1
@MarekTakac, आपको सिस्टम कीबोर्ड को अक्षम करना होगा और हर गतिविधि में अपने कस्टम कीबोर्ड को जोड़ना होगा। यदि किसी गतिविधि में एकाधिक EditTexts हैं, तो आपको onFocusChangedListenerउनमें एक जोड़ने की आवश्यकता होगी ताकि जब वे ध्यान केंद्रित करें तो आप InputConnectionवर्तमान EditTextसे अपने कस्टम कीबोर्ड पर असाइन कर सकें ।
सुरगाच

31

उपयोग करें KeyboardView:

KeyboardView kbd = new KeyboardView(context);
kbd.setKeyboard(new Keyboard(this, R.xml.custom));

kbd.setOnKeyboardActionListener(new OnKeyboardActionListener() {
    ....
}

अब आपके पास kbdएक सामान्य दृश्य है।

इसके बारे में अच्छी बात यह है कि R.xml.customसंदर्भित करता है /res/xml/custom.xml, जो कीबोर्ड के लेआउट को xml में परिभाषित करता है। इस फाइल के बारे में अधिक जानकारी के लिए यहाँ देखें: कीबोर्ड , Keyboard.Row , Keyboard.Key


2
मैं कीबोर्ड व्यू क्लास का उपयोग कर रहा हूं, लेकिन एपीआई 29 के रूप में, अब यह पदावनत हो गया है।
अभिजीत

14

यहाँ एक नरम कीबोर्ड के लिए एक नमूना परियोजना है।

https://developer.android.com/guide/topics/text/creating-input-method.html

एक अलग लेआउट के साथ आपकी पंक्तियाँ समान पंक्तियों में होनी चाहिए।

संपादित करें: यदि आपको केवल अपने एप्लिकेशन में कीबोर्ड की आवश्यकता है, तो यह बहुत सरल है! ऊर्ध्वाधर अभिविन्यास के साथ एक रैखिक लेआउट बनाएं, और क्षैतिज अभिविन्यास के साथ इसके अंदर 3 रैखिक लेआउट बनाएं। फिर उन क्षैतिज रैखिक लेआउट में से प्रत्येक में प्रत्येक पंक्ति के बटन रखें, और बटन के लिए वजन संपत्ति असाइन करें। Android का उपयोग करें: उन सभी के लिए लेआउट_वेट = 1, ताकि वे समान रूप से स्थान पाएं।

इससे हल निकलेगा। यदि आपको वह नहीं मिला, जो अपेक्षित था, तो कृपया यहाँ कोड पोस्ट करें, और हम आपकी मदद करने के लिए यहाँ हैं!


संपादन वास्तव में बुरा है क्योंकि इसका मतलब है कि कीबोर्ड हमेशा दिखाया जाता है और स्टॉक एंड्रॉइड कीबोर्ड की तरह व्यवहार नहीं करेगा।
m0skit0


4

मैं हाल ही में इस पोस्ट पर आया था जब मैं यह तय करने की कोशिश कर रहा था कि मैं अपने स्वयं के कस्टम कीबोर्ड बनाने के लिए किस पद्धति का उपयोग करूं। मुझे एंड्रॉइड सिस्टम एपीआई बहुत सीमित लगता है, इसलिए मैंने अपना खुद का इन-ऐप कीबोर्ड बनाने का फैसला किया। मेरे शोध के आधार के रूप में सुरगच के उत्तर का उपयोग करते हुए , मैंने अपने स्वयं के कीबोर्ड घटक को डिजाइन किया । यह एक MIT लाइसेंस के साथ GitHub पर पोस्ट किया गया है। उम्मीद है कि यह किसी और समय और सिरदर्द को बचाएगा।

वास्तुकला बहुत लचीला है। एक मुख्य दृश्य (CustomKeyboardView) है जिसे आप अपने इच्छित कीबोर्ड लेआउट और नियंत्रक के साथ इंजेक्ट कर सकते हैं।

आपको बस आप गतिविधि xml में CustomKeyboardView घोषित करना होगा (आप इसे प्रोग्रामेटिक रूप से भी कर सकते हैं):

    <com.donbrody.customkeyboard.components.keyboard.CustomKeyboardView
    android:id="@+id/customKeyboardView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" />

फिर इसके साथ अपने EditText को पंजीकृत करें और यह बताएं कि उन्हें किस प्रकार के कीबोर्ड का उपयोग करना चाहिए:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val numberField: EditText = findViewById(R.id.testNumberField)
    val numberDecimalField: EditText = findViewById(R.id.testNumberDecimalField)
    val qwertyField: EditText = findViewById(R.id.testQwertyField)

    keyboard = findViewById(R.id.customKeyboardView)
    keyboard.registerEditText(CustomKeyboardView.KeyboardType.NUMBER, numberField)
    keyboard.registerEditText(CustomKeyboardView.KeyboardType.NUMBER_DECIMAL, numberDecimalField)
    keyboard.registerEditText(CustomKeyboardView.KeyboardType.QWERTY, qwertyField)
}

CustomKeyboardView बाकी को संभालता है!

मुझे एक नंबर, नंबरडिकिमल और QWERTY कीबोर्ड के साथ गेंद लुढ़कती मिली है। इसे डाउनलोड करने और अपने स्वयं के लेआउट और नियंत्रक बनाने के लिए स्वतंत्र महसूस करें। यह इस तरह दिख रहा है:

Android कस्टम कीबोर्ड gif परिदृश्य

यहां छवि विवरण दर्ज करें

यहां तक ​​कि अगर यह आपके साथ जाने का फैसला करने वाला आर्किटेक्चर नहीं है, तो उम्मीद है कि यह काम करने वाले इन-ऐप कीबोर्ड के लिए सोर्स कोड देखने में मददगार होगा।

फिर से, यहां प्रोजेक्ट का लिंक दिया गया है: कस्टम इन-ऐप कीबोर्ड


2

खैर सुरागाच ने अब तक का सबसे अच्छा जवाब दिया लेकिन उन्होंने कुछ मामूली सामानों को छोड़ दिया जो कि ऐप को संकलित करने के लिए महत्वपूर्ण थे।

मुझे उम्मीद है कि उनके जवाब में सुधार करके सुरागा से बेहतर उत्तर दिया जा सकता है। मैं सभी लापता तत्वों को जोड़ दूंगा जो उसने नहीं डाला।

मैंने एंड्रॉइड ऐप, एपीके बिल्डर 1.1.0 का उपयोग करके अपने APK को संकलित किया। तो चलिए शुरू करते हैं।

एंड्रॉइड ऐप बनाने के लिए हमें कुछ फ़ाइलों और फ़ोल्डरों की आवश्यकता होती है जो एक निश्चित प्रारूप में व्यवस्थित होते हैं और उसी के अनुसार कैपिटल किए जाते हैं।

Res लेआउट -> xml फाइलें दिखाती हैं कि ऐप फोन पर कैसा दिखेगा। HTML आकार वेब ब्राउज़र पर कैसे दिखता है के समान। तदनुसार अपने एप्लिकेशन को स्क्रीन पर फिट करने की अनुमति दें।

मान -> निरंतर डेटा जैसे कि color.xml, strings.xml, styles.xml। इन फ़ाइलों को ठीक से वर्तनी होना चाहिए।

drawable -> pics {jpeg, png, ...}; उन्हें कुछ भी नाम दें।

mipmap -> अधिक तस्वीरें। ऐप आइकन के लिए उपयोग किया जाता है?

xml -> अधिक xml फ़ाइलें।

src -> html में जावास्क्रिप्ट की तरह कार्य करता है। लेआउट फ़ाइलें आरंभिक दृश्य आरंभ करेंगी और आपकी जावा फ़ाइल गतिशील रूप से टैग तत्वों को नियंत्रित करेगी और घटनाओं को ट्रिगर करेगी। HTML में भी लेआउट की तरह ही इवेंट्स को सीधे एक्टिवेट किया जा सकता है।

AndroidManifest.xml -> यह फ़ाइल पंजीकृत करती है कि आपका ऐप क्या है। एप्लिकेशन का नाम, प्रोग्राम का प्रकार, अनुमतियाँ, आदि। यह एंड्रॉइड को सुरक्षित बनाने के लिए लगता है। कार्यक्रम वस्तुतः वह नहीं कर सकते हैं जो उन्होंने मैनिफेस्ट में पूछा था।

अब 4 प्रकार के एंड्रॉइड प्रोग्राम हैं, एक गतिविधि, एक सेवा, एक सामग्री प्रदाता और एक प्रसारण प्राप्तकर्ता। हमारा कीबोर्ड एक सेवा होगी, जो इसे पृष्ठभूमि में चलाने की अनुमति देता है। यह लॉन्च करने के लिए ऐप्स की सूची में प्रकट नहीं होगा; लेकिन इसे अनइंस्टॉल किया जा सकता है।

अपने एप्लिकेशन को संकलित करने के लिए, ग्रेडेल और एपीके साइनिंग शामिल है। आप शोध कर सकते हैं कि एक या Android के लिए APK बिल्डर का उपयोग करें। यह सुपर आसान है।

अब जब हम एंड्रॉइड डेवलपमेंट को समझते हैं, तो हम फाइल और फोल्डर बनाते हैं।

  1. जैसा कि मैंने ऊपर चर्चा की फाइल और फ़ोल्डर बनाएँ। मेरी निर्देशिका wil देखो इस प्रकार है:

    • numpad
      • AndroidManifest.xml
      • src
        • Saragch
          • num_pad
            • MyInputMethodService.java
      • रेस
        • drawable
          • Suragch_NumPad_icon.png
        • ख़ाका
          • key_preview.xml
          • keyboard_view.xml
        • एक्सएमएल
          • method.xml
          • number_pad.xml
        • मान
          • colors.xml
          • strings.xml
          • styles.xml

याद रखें कि यदि आप एक विचारधारा का उपयोग कर रहे हैं जैसे कि एंड्रॉइड स्टूडियो में यह एक परियोजना फ़ाइल हो सकती है।

  1. फाइलें लिखें।

A: NumPad / Res / Layout / key_preview.xml

<?xml version="1.0" encoding="utf-8"?>
   <TextView
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:gravity="center"
      android:background="@android:color/white"
      android:textColor="@android:color/black"
      android:textSize="30sp">
</TextView>

बी: न्यूमपैड / रेस / लेआउट / कीबोर्ड_व्यू.एक्सएमएल

<?xml version="1.0" encoding="utf-8"?>
<android.inputmethodservice.KeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboard_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:keyPreviewLayout="@layout/key_preview"
    android:layout_alignParentBottom="true">

</android.inputmethodservice.KeyboardView>

C: NumPad / Res / xml / method.xml

<?xml version="1.0" encoding="utf-8"?>
<input-method  xmlns:android="http://schemas.android.com/apk/res/android">
    <subtype  android:imeSubtypeMode="keyboard"/>
</input-method>

डी: Numpad / Res / xml / number_pad.xml

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="20%p"
    android:horizontalGap="5dp"
    android:verticalGap="5dp"
    android:keyHeight="60dp">

    <Row>
        <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/>
        <Key android:codes="50" android:keyLabel="2"/>
        <Key android:codes="51" android:keyLabel="3"/>
        <Key android:codes="52" android:keyLabel="4"/>
        <Key android:codes="53" android:keyLabel="5" android:keyEdgeFlags="right"/>
    </Row>

    <Row>
        <Key android:codes="54" android:keyLabel="6" android:keyEdgeFlags="left"/>
        <Key android:codes="55" android:keyLabel="7"/>
        <Key android:codes="56" android:keyLabel="8"/>
        <Key android:codes="57" android:keyLabel="9"/>
        <Key android:codes="48" android:keyLabel="0" android:keyEdgeFlags="right"/>
    </Row>

    <Row>
        <Key android:codes="-5"
             android:keyLabel="DELETE"
             android:keyWidth="40%p"
             android:keyEdgeFlags="left"
             android:isRepeatable="true"/>
        <Key android:codes="10"
             android:keyLabel="ENTER"
             android:keyWidth="60%p"
             android:keyEdgeFlags="right"/>
    </Row>

</Keyboard>

बेशक यह आसानी से अपनी पसंद के अनुसार संपादित किया जा सकता है। तुम भी लेबल के लिए शब्दों के बजाय छवियों का उपयोग कर सकते हैं।

Suragch didnt मूल्यों फ़ोल्डर में फ़ाइलों को प्रदर्शित करता है और माना जाता है कि हमारे पास एंड्रॉइड स्टूडियो तक पहुंच थी; जो स्वचालित रूप से उन्हें बनाता है। अच्छी बात है कि मेरे पास एपीके बिल्डर है।

E: NumPad / Res / मान / रंग / xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>

F: NumPad / res / values ​​/ strings.xml

<resources>
    <string name="app_name">Suragch NumPad</string>
</resources>

जी: न्यूमपैड / रेस / वैल्यू / स्टाइल.एक्सएमएल

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>

एच: नंपाद / AndroidManifest.xml

यह वह फाइल है जो वास्तव में तनाव के लिए थी। यहां मुझे लगा कि मैं अपने कार्यक्रम को कभी संकलित नहीं करूंगा। सिसकी। सिसकी। यदि आप Suracgh के उत्तर की जांच करते हैं, तो आप देखते हैं कि वह खेतों का पहला सेट खाली छोड़ देता है, और इस फ़ाइल में गतिविधि टैग जोड़ता है। जैसा कि मैंने कहा कि चार प्रकार के Android कार्यक्रम हैं। लॉन्चर आइकन के साथ एक गतिविधि एक नियमित ऐप है। यह सुन्नपन कोई गतिविधि नहीं है! इसके अलावा उन्होंने किसी भी गतिविधि को लागू नहीं किया।

मेरे दोस्तों में गतिविधि टैग शामिल नहीं है। आपका कार्यक्रम संकलित करेगा, और जब आप लॉन्च करने का प्रयास करेंगे तो यह दुर्घटनाग्रस्त हो जाएगा! के रूप में xmlns के लिए: Android और उपयोग-एसडीके; मैं वहाँ तुम्हारी मदद नहीं कर सकता। यदि वे काम करते हैं तो बस मेरी सेटिंग्स का प्रयास करें।

जैसा कि आप देख सकते हैं कि एक सेवा टैग है, जो इसे एक सेवा के रूप में पंजीकृत करता है। इसके अलावा service.android:name हमारी जावा फ़ाइल में सार्वजनिक श्रेणी का विस्तार करने वाली सेवा का नाम होना चाहिए। यह तदनुसार पूंजीकृत किया जाना चाहिए। पैकेज भी पैकेज का नाम है जिसे हमने जावा फाइल में घोषित किया है।

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="Saragch.num_pad">

    <uses-sdk
        android:minSdkVersion="12"
        android:targetSdkVersion="27" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/Suragch_NumPad_icon"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <service
            android:name=".MyInputMethodService"
            android:label="Keyboard Display Name"
            android:permission="android.permission.BIND_INPUT_METHOD">

            <intent-filter>
                <action android:name="android.view.InputMethod"/>
            </intent-filter>

            <meta-data
                android:name="android.view.im"
                android:resource="@xml/method"/>

        </service>

    </application>
</manifest>

I: NumPad / src / Saragch / num_pad / MyInputMethodService.java

नोट: मुझे लगता है कि जावा src का एक विकल्प है।

यह एक और समस्या फ़ाइल थी लेकिन प्रकट फ़ाइल के रूप में विवादास्पद नहीं थी। जैसा कि मुझे पता है कि क्या है, क्या नहीं है, यह जानने के लिए जावा काफी अच्छा है। मैं मुश्किल से xml जानता हूं और यह एंड्रॉइड विकास के साथ कैसे संबंध रखता है!

यहाँ समस्या वह कुछ भी आयात नहीं किया था! मेरा मतलब है, उसने हमें एक "पूर्ण" फ़ाइल दी जिसमें उन नामों का उपयोग किया गया है जिन्हें हल नहीं किया जा सकता है! InputMethodService, कीबोर्ड, आदि कि बुरा अभ्यास है श्री Suragch। मेरी मदद करने के लिए धन्यवाद, लेकिन अगर आपने नाम कैंट हल करने के लिए कोड को संकलित करने की उम्मीद कैसे की?

निम्नलिखित सही रूप से संपादित संस्करण है। मैं अभी कुछ संकेत देता हूं कि मुझे आयात करने के लिए सीखने के लिए सही जगह पर ले जाना चाहिए।

package Saragch.num_pad;

import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.KeyboardView;
import android.inputmethodservice.Keyboard;

import android.text.TextUtils;
import android.view.inputmethod.InputConnection;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


public class MyInputMethodService extends InputMethodService implements KeyboardView.OnKeyboardActionListener 
{
    @Override
    public View onCreateInputView() 
    {
     // get the KeyboardView and add our Keyboard layout to it
     KeyboardView keyboardView = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard_view, null);
     Keyboard keyboard = new Keyboard(this, R.xml.number_pad);
     keyboardView.setKeyboard(keyboard);
     keyboardView.setOnKeyboardActionListener(this);
     return keyboardView;
    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) 
    {

        InputConnection ic = getCurrentInputConnection();

        if (ic == null) return;

        switch (primaryCode)
        {
         case Keyboard.KEYCODE_DELETE:
            CharSequence selectedText = ic.getSelectedText(0);

            if (TextUtils.isEmpty(selectedText)) 
            {
             // no selection, so delete previous character
             ic.deleteSurroundingText(1, 0);
            }

            else 
            {
             // delete the selection
             ic.commitText("", 1);
            }

            ic.deleteSurroundingText(1, 0);
            break;

         default:
            char code = (char) primaryCode;
            ic.commitText(String.valueOf(code), 1);
        }
    }

    @Override
    public void onPress(int primaryCode) { }

    @Override
    public void onRelease(int primaryCode) { }

    @Override
    public void onText(CharSequence text) { }

    @Override
    public void swipeLeft() { }

    @Override
    public void swipeRight() { }

    @Override
    public void swipeDown() { }

    @Override
    public void swipeUp() { }
}
  1. संकलन करें और अपने प्रोजेक्ट पर हस्ताक्षर करें।

    यह वह जगह है जहां मैं एक नए एंड्रॉइड डेवलपर के रूप में क्लूलेस हूं। मैं इसे मैन्युअल रूप से सीखना चाहूंगा, क्योंकि मेरा मानना ​​है कि वास्तविक प्रोग्रामर मैन्युअल रूप से संकलन कर सकते हैं।

मुझे लगता है कि उपशीर्षक संकलन और पैकेजिंग के लिए एपीके में से एक है। apk ज़िप फ़ाइल के लिए जार फ़ाइल या रार जैसा प्रतीत होता है। फिर दो प्रकार के हस्ताक्षर होते हैं। डिबग कुंजी जिसे प्ले स्टोर और निजी कुंजी पर आवंटित नहीं किया गया है।

खैर श्री सरगच को हाथ दें। और मेरा वीडियो देखने के लिए धन्यवाद। लाइक करें, सब्सक्राइब करें


1

एक ही समस्या थी। मैंने पहली बार टेबल लेआउट का उपयोग किया था लेकिन एक बटन प्रेस के बाद लेआउट बदलता रहा। हालांकि यह पृष्ठ बहुत उपयोगी पाया गया। http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-creating-a-numeric-keypad-with-gridlayout/


3
यकीन नहीं है कि स्पेगेटी कहाँ पाया जाना है। उदाहरण के लिए केवल कोड लागू करने की 5 लाइनें पसंद हैं।
ग्लेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.