সংখ্যাপিকারে সফট কীবোর্ড অক্ষম করুন


168

সংখ্যার মান প্রবেশ করার জন্য একটি নম্বর পিকার ব্যবহার করার সময় আমি নরম কীবোর্ড নিষ্ক্রিয় করার চেষ্টা করছি (নান্দনিক কারণে)। এটি আমার লেআউট-এক্সএমএল-কোড:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="30dp"
        android:layout_marginTop="30dp" >

        <NumberPicker
            android:id="@+id/repetitionPicker"
            android:layout_width="40dp"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/repetitions_short_divider"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <NumberPicker
            android:id="@+id/weightPicker"
            android:layout_width="40dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="40dp" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/pounds"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>


    <Button
        android:id="@+id/saveButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/save" />

</LinearLayout>

এবং অবশেষে এটিই কোড যেখানে আমি অনক্রিট () - পদ্ধতিতে কীবোর্ডটি ব্লক করার চেষ্টা করি:

// hide keyboard
View.OnClickListener disableKeyBoardListener = new View.OnClickListener() {
    public void onClick(View v) {
        ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
                .hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
};

((EditText) weightPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);
((EditText) repetitionPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);

((EditText) weightPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//((EditText) repetitionPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//weightPicker.setOnClickListener(disableKeyBoardListener);
//repetitionPicker.setOnClickListener(disableKeyBoardListener);     

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

দুঃখের বিষয়, একটি নম্বর পিকারে ক্লিক করার পরে নরম কীবোর্ডটি এখনও প্রদর্শিত হয়। কোন ধারনা?

উত্তর:


475

সবে এটি পাওয়া গেছে এবং এটি একটি কবজির মতো কাজ করে:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

আপনি এটি এক্সএমএলে সেট করতে পারেন:

android:descendantFocusability="blocksDescendants" 

1
যতক্ষণ না আমি কিছু মিস করছি, এটি নম্বর পিকারের জন্য একটি মান টাইপ করার ক্ষমতা সরিয়ে দেয়। আপনি কীভাবে পিকারটি ব্যবহার করছেন তার উপর নির্ভর করে এটি কোনও খারাপ জিনিস নয়, তবে এটি সমাধানের একটি সীমাবদ্ধতা বলে মনে হয়।
frenziedherring

76
আপনি এটি এক্সএমএল এ সেট করতে পারেন: অ্যান্ড্রয়েড: বংশোক্তি ফোকাসেবলি = "ব্লকসিসেন্ডেন্টস"
বেন ক্লেটন

1
আআআহ, ব্লকসেসেন্ডেন্টস, অবশ্যই। আপনাকে অনেক ধন্যবাদ :)
লেভ

আশ্চর্য সমাধান, আমাকে বাঁচাল!
হামজেহ সোবহ

56

অ্যান্ড্রু ওয়েবারের উত্তরটির এক্সএমএল সংস্করণ

android:descendantFocusability="blocksDescendants"

উদাহরণ

<NumberPicker
        android:id="@+id/your_numberpicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"/>

7

কম / অ্যান্ড্রয়েড / অভ্যন্তরীণ / উইজেট / নাম্বার পিকার.জাভা উত্স কোডটি পড়ার পরে আমি নীচের সমাধানটি পেয়েছি:

// Hide soft keyboard on NumberPickers by overwriting the OnFocusChangeListener
OnFocusChangeListener fcl = new OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        // Do nothing to suppress keyboard
    }
};

((EditText) numberPicker.getChildAt(1)).setOnFocusChangeListener(fcl);

// Suppress soft keyboard from the beginning
((EditText) numberPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);

হ্যাঁ, আমি সরাসরি নম্বর পিকারের চাইল্ড ভিউগুলি সম্পাদনা করতে হয়েছিল। অ্যান্ড্রয়েড এপিআই কখনও কখনও খুব বিরল।
21:34

6

কেবলমাত্র @ ম্যাক্সভোগলারের উত্তরগুলি উন্নত করা হয়েছে (তাই যদি এই ভোটটি @ ম্যাক্সভোগলারের পক্ষেও না চান) এবং এটি একটি শক্ত হ্যাক করুন। এছাড়াও আমাদের কল করার দরকার নেই setOnFocusChangeListenerএবং setInputType। শুধুমাত্র setFocusableমিথ্যা করতে হবে।

বৈশিষ্ট্যটি সক্ষম / অক্ষম করার জন্য নীচে একটি সহায়ক এপিআই রয়েছে

public static void enableNumberPickerManualEditing(NumberPicker numPicker,
        boolean enable) {
    int childCount = numPicker.getChildCount();

    for (int i = 0; i < childCount; i++) {
        View childView = numPicker.getChildAt(i);

        if (childView instanceof EditText) {
            EditText et = (EditText) childView;
            et.setFocusable(enable);
            return;
        }
    }
}

4

এখানে এটি করার অন্য একটি উপায় যা ব্যবহারকারীরা এখনও চাইলে একটি সংখ্যা সম্পাদনা করতে সক্ষম করে - এটি প্রাথমিকভাবে নরম কীবোর্ডকে দমন করে। NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)উপরের উত্তর অনুসারে ইন্টারফেসটি প্রথম প্রদর্শিত হলে সফট কীবোর্ড দমন করতে ব্যবহার করুন । তারপরে আপনার কথোপকথন বা ক্রিয়াকলাপটি প্রয়োগের জন্য View.OnTouchListener, আপনার setOnTouchListener(this)দিকে কল করুন NumberPickerএবং আপনার onTouch(View v,MotionEvent e)নম্বরটি বেছে নেওয়ার ক্ষেত্রে নম্বরটি বাছাইয়ের বংশধরদের ফোকাসযোগ্যতাটিকে তার সাধারণ মানের কাছে আনুন, তারপরে মিথ্যা প্রত্যাবর্তন করুন।

মিথ্যা প্রত্যাবর্তনের অর্থ হ'ল টাচটি এখনও নম্বর পিকার দ্বারা প্রক্রিয়া করা হয়, যার অর্থ ব্যবহারকারী যদি সম্পাদনা বাক্সটি ট্যাপ করে তবে নরম কীবোর্ড উপস্থিত হয়। এটি হ'ল আমি একই সমস্যার মুখোমুখি হয়েছি - ডায়ালগটি উপস্থিত হওয়ার পরে প্রথম বার দেখায় এটি সফট কীবোর্ডকে অসন্তুষ্ট করে তোলে।

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {

onCreateDialog()পদ্ধতিতে ডায়ালগ তৈরি করার পরে এবং নম্বর পিকারটি আবিষ্কার করার পরে:

m_oldFocus = m_numberpicker.getDescendantFocusability();
m_numberpicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 
m_numberpicker.setOnTouchListener(this);

এবং এখানে অন-টাচ পদ্ধতিটি রয়েছে:

public boolean onTouch(View v, MotionEvent event) {
    m_numberpicker.setDescendantFocusability(m_oldFocus);
    return false;
}

1
শুধুমাত্র এই একজন আমাকে আমার সমস্যার সমাধান করতে সহায়তা করেছেন, আপনার পদ্ধতির জন্য ধন্যবাদ
মসৃণ করুন ut

2

সবচেয়ে সহজ কাজটি আমি খুঁজে পেলাম:

numberPicker               = (NumberPicker) myDialogView.findViewById(R.id.myViewId);
EditText numberPickerChild = (EditText) numberPicker.getChildAt(0);
numberPickerChild.setFocusable(false);
numberPickerChild.setInputType(InputType.TYPE_NULL);

2

আপনার নম্বর পিকারের সাথে ভিউ লোড করার সময় আপনি যদি কেবল সফ্টওয়্যার কীবোর্ডটি আড়াল করতে চান তবে তবুও ব্যবহারকারীরা ভিউ লোডের পরে সম্পাদনা করতে সক্ষম হতে চান, তবে আপনার বংশধরদের দৃষ্টি আকর্ষণযোগ্যতা অবরুদ্ধ করা উচিত নয়। পরিবর্তে, কেবলমাত্র নম্বরটি বাছাইকারীকে আপনার দৃষ্টিতে প্রথম ফোকাসযুক্ত আইটেম হতে আটকাবেন।

বিস্তারিত জানার জন্য এই উত্তরটি দেখুন ।

উপরের উত্তরের ভিত্তিতে:

    <!-- Dummy item to prevent Number Picker from receiving focus -->
    <LinearLayout        
        android:focusable="true" 
        android:focusableInTouchMode="true"
        android:layout_width="0px" 
        android:layout_height="0px"/>

    <!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component 
         to prevent the dummy from receiving focus again -->
    <NumberPicker 
        android:id="@+id/number_picker"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:nextFocusUp="@id/number_picker" 
        android:nextFocusLeft="@id/number_picker"/>

1

এটি কেন কাজ করে তা আমি জানি না, তবে অনক্লিকলিস্টনার সেট করা যা কিবোর্ড প্রদর্শন করতে বাধা দেয় না (ললিপপ)

numberPicker.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
  }
});

0
/**
 * set focus to top level window
 * disposes descendant focus
 * disposes softInput
 * @param context - activity context
 * @param enable - state of focus
 * */
public static void topLevelFocus(Context context, boolean enable){
    if(Activity.class.isAssignableFrom(context.getClass())){
        ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
        if(tlView!=null){
            tlView.setFocusable(enable);
            tlView.setFocusableInTouchMode(enable);
            tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
            tlView.requestFocus();
        }
    }
}

* এটি কল:

  • বংশোদ্ভূত মনোযোগকে অবরুদ্ধ করবে না (নম্বর পিকার সম্পাদনযোগ্য হবে)

  • তৈরিতে নরম ইনপুটটি আড়াল করবে

  • এর আগে (প্রক্রিয়াজাতকরণ ইনপুট) getValue () সঠিক ওয়ালিউটি পেতে অনুমতি দেবে



0

কার্যকারী কোড :

mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

এক্সএমএল:

android:descendantFocusability="blocksDescendants" 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.