नरम कीबोर्ड दिखाए जाने पर लेआउट को ऊपर ले जाएं?


139

मेरे पास रिलेटिव व्यू में कुछ तत्व हैं, जो एलीवेटेड बॉटम एट्रिब्यूट सेट के साथ हैं, जब सॉफ्ट कीबोर्ड आता है तो सॉफ्ट कीबोर्ड द्वारा एलिमेंट्स को छिपाया जाता है।

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

यह कैसे दृष्टिकोण के बारे में कोई विचार?



@Dinedal कैसे relativeView उर के लिए नीचे की पंक्ति संरेखित करें विशेषता ???
KJEjava48

जवाबों:


107

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

android:windowSoftInputModeया लेआउट आकार दिया गया है या नहीं है कि क्या यह आदि स्क्रॉल: विशेषता एक प्रति गतिविधि के आधार पर क्या होता है निर्दिष्ट करने के लिए इस्तेमाल किया जा सकता


95

आप इस कोड को onCreate()विधि में भी उपयोग कर सकते हैं :

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

11
मेरे लिए भले ही मैं पाठ संपादन मैं क्लिक किया है करने के लिए adjustPan SCRENN कदम सेट केवल ऊपर नहीं बल्कि पूरे लेआउट
murt

33

अपनी गतिविधि के लिए AndroidManifest.xml में जोड़ें:

android:windowSoftInputMode="adjustPan|adjustResize"

22
डॉक्स के अनुसार यदि आप यहां दो "एडजस्ट ..." झंडे का उपयोग करते हैं तो व्यवहार अनिर्दिष्ट है। डेवलपर
।android.com

22

अपनी घोषणापत्र फ़ाइल की गतिविधि में परिवर्तन करें जैसे

windowSoftInputMode="adjustResize"

या

onCreate()गतिविधि वर्ग में अपनी विधि में परिवर्तन करें जैसे

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

11
आप विभिन्न झंडे का उपयोग क्यों करते हैं?
कूलमाइंड

वर्तमान संस्करण के लिए Android उपसर्ग की आवश्यकता होती है: android: windowSoftInputMode = "AdjustResize"
एंड्रिया

21

इसी तरह का मुद्दा मैं अपने लेआउट के साथ सामना कर रहा था जिसमें स्क्रॉल दृश्य शामिल है। जब भी मैं EditText में पाठ का चयन करने की कोशिश करता हूं, तो कॉपी / कट / पेस्ट एक्शन बार को नीचे दिए गए कोड के साथ ऊपर ले जाया जाता है क्योंकि यह लेआउट का आकार नहीं बदलता है

android:windowSoftInputMode="adjustPan"

नीचे के रूप में इसे संशोधित करके

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) style.xml फ़ाइल, गतिविधि शैली में

<item name="android:windowActionBarOverlay">true</item>

इसने काम कर दिया।!!!!!!!!!!!!


18

AndroidManifest.xml में, सेट करना न भूलें:

 android:windowSoftInputMode="adjustResize"

और स्क्रॉल के अंदर RelativeLayout के लिए सेट करें:

 android:layout_gravity="center" or android:layout_gravity="bottom" 

यह ठीक होगा


एंड्रॉइड: लेआउट_ग्रेविटी = "केंद्र" काम किया, धन्यवाद! :) अब EditText कीबोर्ड पर आगे बढ़ता है जैसा कि मैं चाहता था
पावेल बिरुकोव

11

इसकी ऑनक्रिएट मेथोड में गतिविधि के लिए नीचे लाइन डालें

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

और इसकी ऑनक्रेट विधि में अंशों के लिए

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

10

स्क्रीन को स्क्रॉल करने के लिए 3 चरण हैं।

  1. अपनी गतिविधि के लिए घोषणापत्र फ़ाइल में लिखें:

एंड्रॉयड: windowSoftInputMode = "adjustResize"

  1. अपनी गतिविधि के oncreate () विधि में निम्नलिखित पंक्ति जोड़ें

। GetWindow () setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. फिर अपना पूरा दृश्य XML फ़ाइल में "स्क्रॉलव्यू" में रखें:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

PS Android को जोड़ना न भूलें: मूल संबंध लेआउट में लेआउट_ग्रेविटी = "केंद्र"।


6

मैंने डिएगो रामिरेज़ की एक विधि की कोशिश की, यह काम करता है। AndroidManifest में:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

Activity_main.xml में:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>

6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

लेआउट के आसपास NestedScrollView जोड़ें जिसे आप स्क्रॉल करना चाहते हैं, यह पूरी तरह से काम करेगा


3

मुझे अपनी समस्याओं का हल मिल गया है कि यह आपके जैसा ही है।

सबसे पहले, मेरे पास केवल 2 तत्वों के साथ एक LinearLayout है, एक ImageView और एक LinearLayout विच में 2 EditText और एक बटन शामिल हैं, इसलिए मुझे कीबोर्ड के बिना उन्हें पूर्ण स्क्रीन में अलग रखने की आवश्यकता थी, और जब कीबोर्ड प्रकट होता है, तो उन्हें करीब से देखना चाहिए।

इसलिए मैंने उनके बीच 0dp और वजन 1 में ऊँचाई की विशेषता के साथ दृश्य जोड़ा, जिससे मैं अपने विचारों को एक दूसरे से अलग रख सकूँ। और जब कीबोर्ड एपर्स, जैसा कि उनके पास एक निश्चित ऊंचाई नहीं है, वे बस आकार बदलते हैं और पहलू रखते हैं।

देखा! लेआउट का आकार बदलता है और मेरे विचारों के बीच की दूरी वही होती है जब कीबोर्ड मौजूद होता है या नहीं होता है।


6
बेहतर समझ के लिए आप कोड क्यों नहीं पोस्ट करते हैं?
जोंकरखा

मैंने ऊपर एक नमूना कोड पोस्ट किया: stackoverflow.com/a/31994697/2914140
कूलमाइंड

आप इसे एक कम हैकरी तरीके से प्राप्त कर सकते हैं ConstraintLayoutएक शीर्ष अनुभाग का उपयोग करके और ऊपर से नीचे अनुभाग और नीचे अनुभाग। जब कीबोर्ड खुलता है तो यह स्वाभाविक रूप से बीच में जगह को निचोड़कर आकार देगा (यदि आप उपयोग करते हैं adjustResize)
hmac

2
If user want this task using manifest then add this line in manifest
In manifest add this line: - android:windowSoftInputMode="adjustPan"
    e.g.
     <activity
           android:name=".ui.home.HomeActivity"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="adjustPan">
     </activity>


    In Java File or Kotlin File(Programically) : - If user want this using Activity then add below line in onCreate Method

    activity!!.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

नमस्ते और स्टैकओवरफ़्लो में आपका स्वागत है, और आपके उत्तर के लिए धन्यवाद। केवल कोड के एक ब्लॉक को पोस्ट करने के बजाय, क्या आप इस बात का संक्षिप्त विवरण दे सकते हैं कि आप किस मुद्दे को हल कर रहे हैं और आपने इसे कैसे हल किया? यह उन लोगों की मदद करेगा जो भविष्य में इस प्रश्न को बेहतर ढंग से समझते हैं और इससे कैसे निपटना है।
प्लूटियन

1

यहाँ पूर्ण प्रकट कोड है

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

1

यदि आप अंशों में हैं, तो आपको अपने कोड के नीचे कोड जोड़ना होगा अपनी गतिविधि पर यह मेरे लिए समस्या हल करता है

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

1

अपनी मैनिफ़ेस्ट फ़ाइल में नीचे की पंक्ति जोड़ें। यह काम करेगा

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>

1

मैंने सिर्फ निम्न स्तर को शीर्ष स्तर के लेआउट में जोड़ा और सब कुछ काम किया:

android:fitsSystemWindows="true"

@ yash786 संभवतः एडिटेक्स के नीचे का शो बटन है जो फोकस प्राप्त करता है? दूसरा प्रश्न क्या आप लेआउट फ़ाइल साझा कर सकते हैं या मुझे जवाब दे सकते हैं कि आप एडिटेक्स को केबॉर्ड के शीर्ष पर कैसे जोड़ सकते हैं?
हीरो84

यह मेरे लिए एंड्रॉइड के बिना घटना के लिए काम करता है: windowSoftInputMode = "stateV अदृश्य | AdjustResize"
ज़ूम

0

ठीक है, लेकिन यह बहुत देर हो चुकी है लेकिन मैंने पाया है कि यदि आप अपने संपादन पाठ के तहत एक सूची दृश्य जोड़ते हैं तो कीबोर्ड सूचीबद्घ किए बिना उस संपादन के तहत सभी लेआउट ले जाएगा

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

यह एकमात्र समाधान है जिसने मेरे लिए काम किया।


0

एक भी सलाह मेरे मसले को हल नहीं करती। एडजस्ट पैन लगभग उसी तरह है जैसे वर्क एडजस्टाइज रिसाइज । अगर मैं समायोजित कुछ नहीं लेआउट से ऊपर ले जाएँ, लेकिन यह नीचे के मेरे संपादन को छिपाता है कि मैं स्पष्ट रूप से लिख रहा हूँ। इसलिए 24 घंटे तक लगातार खोज करने के बाद मुझे यह स्रोत मिला और इससे मेरी समस्या हल हो गई।


0

यह देर हो सकती है लेकिन मैं कुछ चीजें जोड़ना चाहता हूं। एंड्रॉइड स्टूडियो संस्करण 4.0.1, और ग्रेड संस्करण 6.1.1 में, windowSoftInputMode यदि आप अपनी गतिविधि में निम्नलिखित झंडे जोड़ रहे हैं तो यह अपेक्षित रूप से काम नहीं करेगा:

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

बहुत समय बर्बाद करने के बाद, मुझे वह हैक मिल गया है। के क्रम मेंadjustResizeठीक से काम या AdjustPanकिसी भी विशेषता के windowSoftInputModeलिए, आपको अपनी गतिविधि से इसे हटाने की आवश्यकता है।

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