কীবোর্ড প্রদর্শিত হলে, ফ্লটার উইজেটগুলির পুনরায় আকার দিন। কীভাবে এটি প্রতিরোধ করবেন?


101

আমার কাছে এর মতো বিস্তৃত উইজেটের কলাম রয়েছে:

 return new Container(
      child: new Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          new Expanded(
            flex: 1,
            child: convertFrom,
          ),
          new Expanded(
            flex: 1,
            child: convertTo,
          ),
          new Expanded(
            flex: 1,
            child: description,
          ),
        ],
      ),
    );

দেখে মনে হচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

convertFrom, একটি টেক্সটফিল্ড অন্তর্ভুক্ত। আমি যখন এই পাঠ্য ক্ষেত্রে ট্যাপ করি তখন অ্যান্ড্রয়েড কীবোর্ডটি স্ক্রিনে উপস্থিত হয়। এটি স্ক্রিনের আকার পরিবর্তন করে, তাই উইজেটগুলি এর মতো আকার পরিবর্তন করে:

এখানে চিত্র বর্ণনা লিখুন

আমার কলামটি আকার পরিবর্তন করতে না পারে তারপরে কী কীবোর্ডটির "ওভারলে" স্ক্রিন রয়েছে? আমি যদি Expandedউইজেট ব্যবহার করি না এবং প্রতিটি উইজেটের জন্য উচ্চতা হার্ডকোড না করি , উইজেটগুলির আকার পরিবর্তন হয় না, তবে কীবোর্ডটি উপস্থিত হওয়ার পরে আমি কালো এবং হলুদ স্ট্রাইপযুক্ত ত্রুটি পেয়েছি (কারণ সেখানে পর্যাপ্ত স্থান নেই)। এটি সমস্ত পর্দার আকারের জন্যও নমনীয় নয়।

আমি নিশ্চিত নই যে এটি অ্যান্ড্রয়েড-নির্দিষ্ট বা বিড়বিড় করে নির্দিষ্ট specific


আপনার স্ক্যাফোল্ড শরীরে একটি সিঙ্গলচিল্ডস্ক্রোলভিউ ব্যবহার করুন।
লিনহাদিরটাইলিপে

উত্তর:


259

আপনার মধ্যে Scaffold, resizeToAvoidBottomInsetসম্পত্তি সেট করুন false

সম্পত্তি "রিসাইজটোঅভিডবটমপ্যাডিং" এখন হ্রাস করা হয়েছে .... আপনার Scaffold, resizeToAvoidBottomPaddingসম্পত্তিতে সেট করুন false


11
এর সাথে একই রকম প্রভাব তৈরি করার কোনও উপায় আছে কি android:windowSoftInputMode="adjustPan"? আমি যদি resizeToAvoidBottomPaddingস্ক্যাফোল্ডে যোগ করি তবে এটি টেক্সটফিল্ডটি আচ্ছাদন করে।
Epicality

4
আমি অ্যান্ড্রয়েড সম্পর্কে জানি না, তবে সাধারণত এই ক্ষেত্রে একটি তালিকাভিউর ভিতরে আপনার লেআউটটি মোড়ানো একটি ভাল অনুশীলন
আজিজা

@aziza, আমি একই সমস্যায় ভুগছিলাম তবে আপনার সমাধানের পরে এটির কাজটি ঠিকঠাক হয়েছে, তবে দয়া করে আরও একটি সমস্যা আছে লিংক থেকে ভিডিওটি পরীক্ষা করুন কীবোর্ডটি উপস্থিত হওয়ার পরে চিত্রটি ঝলকিয়েছিল। ড্রপবক্স / এস
কিশান ব্যাস

আমার সাথে @ কিশনভিয়াস একই চিত্র চলে গেছে।
stuckedoverflow

@aziza সলিড উত্তর
Val,

27

বেশিরভাগ উত্তর উত্তর ব্যবহার করার পরামর্শ দেয় resizeToAvoidBottomPadding=false। আমার অভিজ্ঞতায় এটি কীবোর্ডটিকে পাঠ্য ক্ষেত্রগুলি কভার করতে দেয় যদি তারা নীচে থাকে তবে কীবোর্ডটি প্রদর্শিত হবে।

আমার বর্তমান সমাধানটি হ'ল আমার কলামটিকে স্ক্রিনের মতো একই উচ্চতা হতে বাধ্য করা, তারপরে এটি এমন জায়গায় রাখুন SingleChildScrollViewযাতে কীবোর্ডটি ব্যবহার করার সময় ফ্লটারটি স্বয়ংক্রিয়ভাবে আমার স্ক্রিনটি স্ক্রল করে দেয়।

Widget build(BuildContext context) {
  return Scaffold(
    body: SingleChildScrollView(
      physics: NeverScrollableScrollPhysics(),
      child: ConstrainedBox(
        constraints: BoxConstraints(
          minWidth: MediaQuery.of(context).size.width,
          minHeight: MediaQuery.of(context).size.height,
        ),
        child: IntrinsicHeight(
          child: Column(
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
              // CONTENT HERE
            ],
          ),
        ),
      ),
    ),
  );
}

আমি ব্যবহার করি NeverScrollableScrollPhysicsযাতে ব্যবহারকারী নিজের চারপাশে স্ক্রোল করতে না পারে।


4
আমি আপনার পদ্ধতিটি ছাড়াই চেষ্টা করেছি NeverScrollableScrollPhysicsএবং ব্যবহারকারীর উপরে এবং নীচে সোয়াইপ করার চেষ্টা করতে পারে এবং তারা ওভারসক্রোলের আভা দেখতে পাবে all আমি যখন NeverScrollableScrollPhysicsএটি ব্যবহার করি তা আমাকে একই আচরণ দেয়resizeToAvoidBottomInset
সাজাদ জাওয়ার্ড

প্রাথমিক সম্পত্তিটিকে মিথ্যা হিসাবে সেট করুন।
ভিএলএক্সইউ

16

এর পরিবর্তে সেট resizeToAvoidBottomInsetকরা হ্রাস করা হয়।falseresizeToAvoidBottomPadding

    return Scaffold(
      resizeToAvoidBottomInset : false,
      body: YourWidgets(),
    );

এই উত্তর গৃহীত থেকে আলাদা কীভাবে?
ওজনুগা জুড ওচালিফু

4
তারা একই উত্তর @ ওজনুগা, সম্ভবত আমার পোস্ট করার পরে সম্পাদক গ্রহণযোগ্য উত্তর আপডেট করেছেন তাই এখন পার্থক্যটি কি আমার একটি উদাহরণ অন্তর্ভুক্ত করে?
ArtiomLK

4

পদ্ধতি 1:android:windowSoftInputMode="adjustResize" AndroidManLive.xML ফাইল থেকে সরান (অন্যথায় এটি বিড়বিড় কোডটি ওভাররাইড করবে) এবং যুক্ত করুনresizeToAvoidBottomPadding: false নীচের মতো স্ক্যাফোর্ডে :

Scaffold(
      resizeToAvoidBottomPadding: false,
      appBar: AppBar()
)

পদ্ধতি 2 (প্রস্তাবিত নয়): কেবল যুক্ত করুনandroid:windowSoftInputMode="stateVisible" অ্যান্ড্রয়েড অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল যুক্ত করুন ক্রিয়াকলাপে এটি কেবল আইওএসের মতো নয় অ্যান্ড্রয়েড অ্যান নট ফর আইওডের জন্য কাজ করবে।

<activity
       ...
        android:windowSoftInputMode="stateVisible">

দ্রষ্টব্য: এটি সেট করবেন নাandroid:windowSoftInputMode="adjustResize"


4

ভাল আমি মনে করি যদি আমরা @ আমানের সমাধানটি প্রয়োগ করি তবে এটি আমাদের অ্যাপ্লিকেশনটিকে কুরুচিপূর্ণ আচরণ করবে যেমন কীবোর্ড প্রদর্শিত হবে, এটি উপলব্ধ উচ্চতা অনুযায়ী স্ক্রিনের আমাদের ভিউপোর্টটি সামঞ্জস্য করবে না এবং এটি অন্যান্য ক্ষেত্রগুলি কীবোর্ডের আড়ালে লুকিয়ে রাখবে। সুতরাং আমি SingleChildScrollViewপরিবর্তে ব্যবহার পরামর্শ দেব ।

SingleChildScrollViewনীচের মত আপনার কোডটি মোড়ানো

 return new Container(
  child: SingleChildScrollView(
    child: new Column(
    crossAxisAlignment: CrossAxisAlignment.stretch,
    children: <Widget>[
      new Expanded(
        flex: 1,
        child: convertFrom,
      ),
      new Expanded(
        flex: 1,
        child: convertTo,
      ),
      new Expanded(
        flex: 1,
        child: description,
      ),
    ],
  ),
 ),
);

2

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


4
তবে এটি আপনার নির্বাচিত পাঠ্যফিল্ডটি দৃশ্যমান হওয়ার জন্য তৈরি করে না, কীবোর্ডটি এখনও এটিকে ওভারল্যাপ করবে। আপনাকে এটি নিজেই স্ক্রোল করতে হবে। অ্যান্ড্রয়েড বিকাশকারী / ব্যবহারকারী হিসাবে
বয়

2

আমার পদ্ধতির পদার্থবিজ্ঞানের SingleChildScrollViewসাথে ব্যবহার করা ClampingScrollPhysics

SingleChildScrollView(
  physics: ClampingScrollPhysics(),
  child: Container(),
)

1

আমার জন্য আইটেম সম্পত্তি নীচে থেকে মিথ্যা পরিবর্তন

<item name="android:windowFullscreen">false</item>

ফাইল

android/app/src/main/res/values/styles.xml

ইনপুট ফোকাসে সমস্ত পৃষ্ঠার সামগ্রীকে উপরের দিকে টানতে ফ্লার্ট তৈরি করেছে

ঝাঁকুনি ইনপুট ফোকাসের উপরে সমস্ত পৃষ্ঠার সামগ্রী টানুন drag


0

আমার পরামর্শ হ'ল resizeToAvoidBottomInset: falseহঠাৎ স্ক্রিনে কীবোর্ডটি প্রদর্শিত হলে উইজেটগুলিকে পুনরায় আকার দেওয়া থেকে বিরত রাখতে কোনওভাবেই ব্যবহার করা উচিত । উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারী আপনার অ্যাপে থাকাকালীন ফেসবুক চ্যাট হেড ব্যবহার করে।

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

final double screenHeight = MediaQuery.of(context).size.height;
final double keyboardHeight = MediaQuery.of(context).viewInsets.bottom;
return Scaffold(
  resizeToAvoidBottomInset: false,
  body: SizedBox(
    height: screenHeight - keyboardHeight,
    child: SingleChildScrollView(
      child: Column(
        children: [
          const SizedBox(height: 200),
          for (var i = 0; i < 10; i++) const TextField()
        ],
      ),
    ),
  ),
);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.