অ্যান্ড্রয়েড ললিপপ, অ্যাপকম্প্যাট অ্যাকশনবার কাস্টম ভিউ পুরো স্ক্রীন প্রস্থ গ্রহণ করে না


97

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

19 দিয়ে বিল্ডিং উপায় এটি চেহারা ব্যবহৃত

21 দিয়ে বিল্ডিং এটি এখন দেখায়

অ্যাকশন বার স্থাপন করতে আমি এই কোডটি ব্যবহার করছি। কারো কোন ধারণা আছে?

final ActionBar actionBar = getSupportActionBar();
if(actionBar != null) {
    actionBar.setDisplayHomeAsUpEnabled(false);
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    actionBar.setCustomView(R.layout.action_bar_content_search_custom_view);
    actionBar.setBackgroundDrawable(null);
    // actionBar.setStackedBackgroundDrawable(null);
    TextView title = (TextView) actionBar.getCustomView().findViewById(R.id.action_bar_title);
    title.setText(R.string.youtube);
    ImageView back = (ImageView) actionBar.getCustomView().findViewById(R.id.action_bar_back);
    back.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

সম্পাদনা করুন

কাস্টম ভিউটি বের করা এবং পটভূমি পরিবর্তন করা এখন পুরো প্রস্থ গ্রহণ করে। সুতরাং সমস্যাটি হল, আমরা কীভাবে কাস্টমভিউকে অ্যাকশনবারের পুরো প্রস্থটি নিতে পারি?


আপনি যদি সাময়িকভাবে কাস্টম ভিউ অংশগুলি মন্তব্য করেন তবে এটি কি আরও ভাল আচরণ করে? যদি তা না হয় তবে আমি সম্ভবত আপনার থিম থেকে আসা এই দিকে ঝুঁকতে চাই।
কমন্সওয়্যার

আমি কাস্টম ভিউটি সরিয়ে নিয়েছি এবং এটিকে ব্যাকগ্রাউন্ডটি অ্যাকশনবারের ব্যাকগ্রাউন্ডে আঁকতে সক্ষম হিসাবে সেট করেছি এবং ব্যাকগ্রাউন্ডটি এখন পুরো প্রস্থটি গ্রহণ করবে
স্টিভি কিডেকেল

আপনি কাস্টম ভিউ সহ এবং তার বাইরে উভয়ই হাইয়ারচি ভিউতে আপনার ক্রিয়াকলাপটি উঁকি দিতে পারেন এবং দেখতে পারেন যে কাস্টম ভিউয়ের ফলে কোন লেআউট বিধি পরিবর্তন হচ্ছে। এটি সম্ভবত এটি নতুন যে কোনও বাগ appcompat-v7
কমন্সওয়্যার

আমাকে দেখায় জায়গা আপ জন্য সংরক্ষিত হয় ImageView। আরম্ভকারীদের জন্য এটি অক্ষম করার চেষ্টা করুন।
নিকোলা দেশপোটোস্কি

4
হাই, দেখে মনে হচ্ছে এটি কাস্টম ভিউটিকে পুরো প্রশস্ত করে নেওয়া ভাল সমাধান। আমি এটি প্রসারিত না করে এমনকি লেআউট ওজন সেট করেও অভিজ্ঞতা অর্জন করছিলাম। এখানে দেখুন: stackoverflow.com/a/20794736/581574
ratana

উত্তর:


111

দেখে মনে হচ্ছে ActionBarসাম্প্রতিক appcompat-v7আপডেটের সর্বশেষ পরিবর্তনগুলির কারণে এটি হয়েছে । দেখে মনে হচ্ছে আপনার অ্যাকশন বারগুলি কীভাবে পরিচালনা করা উচিত সে সম্পর্কে উল্লেখযোগ্য পরিবর্তন রয়েছে।

আমি একই সমস্যার মুখোমুখি হয়েছি এবং ActionBarডকুমেন্টেশন পড়ার পরে এবং বিশেষত নীচের উদ্ধৃতিটি আমি একটি সমাধান পেয়েছি।

অ্যান্ড্রয়েড এল (এপিআই স্তর 21) দিয়ে শুরু করে, অ্যাকশন বারটি অ্যাপ্লিকেশন বিন্যাসের মধ্যে যে কোনও সরঞ্জামদণ্ড উইজেট দ্বারা উপস্থাপিত হতে পারে। অ্যাপ্লিকেশনটি ক্রিয়াকলাপের সংকেত দিতে পারে যেটি টুলবারকে ক্রিয়াকলাপের অ্যাকশন বার হিসাবে বিবেচনা করা উচিত। এই বৈশিষ্ট্যটি ব্যবহার করে এমন ক্রিয়াকলাপগুলির সরবরাহ করা একটি।

আমি এটি যেভাবে দেখছি, AppCompatথিমগুলি পরিবর্তন করা হয়েছিল এবং একদিকে মনে হয়েছিল কয়েকটি জিনিস ভেঙে গেছে তবে অন্যদিকে আরও নমনীয়তা সরবরাহ করে। আমি এই পদক্ষেপগুলি অনুসরণ করার পরামর্শ দিচ্ছি:

  1. .NoActionBarউপরের উদ্ধৃতিতে বর্ণিত হিসাবে আপনার ক্রিয়াকলাপে শৈলী ব্যবহার করুন
  2. android.support.v7.widget.Toolbarআপনার ক্রিয়াকলাপ বিন্যাসে একটি যুক্ত করুন
  3. app:contentInsetStart="0dp"বৈশিষ্ট্য সেট করুন । আপনি আপনার প্রশ্নে বর্ণিত মার্জিনের সাথে এটিই মূল সমস্যা
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/actionBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:contentInsetEnd="0dp"
    app:contentInsetStart="0dp" >
</android.support.v7.widget.Toolbar>

এটি সাধারণত সুপারিশ করা হয় যে আপনি এটি একটি পৃথক বিন্যাস ফাইলে করুন এবং includeআপনার ক্রিয়াকলাপ বিন্যাসে ব্যবহার করুন যাতে একাধিক ক্রিয়াকলাপে ব্যবহৃত হয় তবে আপনাকে কেবলমাত্র এক জায়গায় টুলবারটি কাস্টমাইজ করতে হবে need

<include layout="@layout/view_action_bar" />
  1. ব্যবহার করুন findViewByIdএবং setSupportActionBarআপনার কার্যকলাপে onCreateকরতেsignal to the Activity which Toolbar should be treated as the Activity's action bar
Toolbar actionBar = (Toolbar) findViewById(R.id.actionBar);
setSupportActionBar(actionBar);
  1. একবার আপনি এটি করতে গেলে, সমস্ত ক্রিয়া যুক্ত হয়ে যায় onCreateOptionsMenu সরঞ্জামদণ্ডে যুক্ত করা হবে এবং এটি ক্রিয়াকলাপ ক্রিয়া বার হিসাবে বিবেচিত হবে।
  2. পছন্দসই হিসাবে সরঞ্জামদণ্ডটি আরও কাস্টমাইজ করুন (শিশু দেখুন ইত্যাদি যোগ করুন)

4
আমি নেভিগেশন ড্রয়ারের সাথে সরঞ্জামদণ্ডটি ব্যবহার করার চেষ্টা করছি তবে আমি ত্রুটি পাচ্ছিError inflating class fragment
আহমেদ নওয়াজ

সমস্ত প্রাসঙ্গিক কোড উত্তরে ভাগ করা হয়। দেখে মনে হচ্ছে আপনার সমস্যার জন্য এটি একটি নতুন সমস্যা শুরু করা উচিত কারণ এটি অন্যরকম সমস্যার মতো মনে হচ্ছে।
মুজিকান্ত

ধন্যবাদ আমি অ্যাকশনবারটি টুলবার দিয়ে প্রতিস্থাপন করে সমস্যার সমাধান করেছি।
আহমেদ নওয়াজ

9
নেমস্পেসের ঘোষণাগুলিতে আপনাকে সুস্পষ্ট প্যাকেজ নাম ব্যবহার করা উচিত নয়। ব্যবহারxmlns:app="http://schemas.android.com/apk/res-auto"
লিমিনাল

4
দরকার নেই setCustomView। আপনি নিজের সরঞ্জামদণ্ডে যে উইজেটগুলি অন্তর্ভুক্ত করতে চান তার সাথে একটি লেআউট ফাইল তৈরি করুন (উদাহরণস্বরূপ উত্তরের 3 অংশে বর্ণিত লেআউট ফাইলটিতে শিশুদের দৃষ্টিভঙ্গি যুক্ত করুন)
মুজিকান্ত

51

মুজিকান্তের উল্লিখিত অনেক কাজ করার পরিবর্তে এবং এই উত্তরটি পছন্দ করুন

    getSupportActionBar().setDisplayShowHomeEnabled(false);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
    LayoutInflater mInflater = LayoutInflater.from(this);

    View mCustomView = mInflater.inflate(R.layout.action_bar_home, null);
    getSupportActionBar().setCustomView(mCustomView);
    getSupportActionBar().setDisplayShowCustomEnabled(true);
    Toolbar parent =(Toolbar) mCustomView.getParent();//first get parent toolbar of current action bar 
    parent.setContentInsetsAbsolute(0,0);// set padding programmatically to 0dp

আপনার সমস্যা সমাধানের জন্য আপনাকে কোডের শেষ দুটি লাইন যুক্ত করতে হবে।

আমি আশা করি এটি আপনার এবং অন্য যে কোনও ব্যক্তিকে সহায়তা করতে পারে।

আপডেট: এটি সম্পর্কে কিছু গবেষণা করার পরে, আমি আবিষ্কার করেছি যে এই সমাধানটি কিছু ক্ষেত্রে কার্যকর হবে না। এর সাথে বাম পাশের ফাঁক (হোম বা পিছ) সরানো হবে তবে ডান পাশের ফাঁক (মেনু) যেমন থাকবে তেমন থাকবে। নীচে এই ক্ষেত্রেগুলির সমাধান রয়েছে।

View v = getSupportActionBar().getCustomView();
LayoutParams lp = v.getLayoutParams();
lp.width = LayoutParams.MATCH_PARENT;
v.setLayoutParams(lp);

উপরের কোডে এই চারটি লাইন যুক্ত করুন, যাতে ডান পাশের ফাঁকটি সমর্থন ক্রিয়া বার থেকেও সরিয়ে দেওয়া হয়।


ধন্যবাদ! ধন্যবাদ! সর্বশেষ 2 লাইনগুলি আইভিকে কী খুঁজছিল!
ডিজিটালমিডেজ

আমরা এই লাইনগুলি কোথায় যুক্ত করব? টুলবার অংশের পরে?
জেন

4
@ সুমাররা হ্যাঁ এগুলি সরঞ্জামদণ্ডের কোডের সাথে সাথে যুক্ত করুন।
অমৃত বিদ্রি

31

আমি মনে করি আপনি এটি শৈলীতেও করতে পারেন। এটা চেষ্টা কর. কিটকেটে এটি পরীক্ষা করেছে

<style name="AppTheme" parent="Theme.AppCompat">
  <item name="toolbarStyle">@style/AppThemeToolbar</item>
</style>

<style name="AppThemeToolbar" parent="Widget.AppCompat.Toolbar" >
  <item name="contentInsetStart">0dp</item>
</style>

4
এই উত্তরটি ভুল: অ্যান্ড্রয়েড: কন্টেন্টআইনসেট স্টার্টটির জন্য API স্তর 21 প্রয়োজন (বর্তমান মিনিট 14)
মিঃবয়ফক্স

তবে, মূর্খতা খুব ভাল! এপিআই 21 এবং পুরানো সংস্করণগুলির জন্য আপনার আলাদাভাবে লেখার স্টাইলের প্রয়োজন।
mr.boyfox

আপনি যদি এখনও ডিফল্ট অ্যাকশন বার ব্যবহার করে থাকেন তবে বাম মার্জিনটি সরিয়ে ফেলার এটি সঠিক উত্তর।
টুরুপ

এটি সত্যিই কাজ করে! সমর্থন lib এর সর্বশেষতম সংস্করণ সহ, আমি মনে করি আপনাকে দু'বার গুণাবলী ঘোষণার দরকার নেই (অ্যান্ড্রয়েড: এগুলি প্রয়োজনীয় নয়)।
BoD

আমি এই সমস্যাটি অনুসন্ধান করছি এবং আমি যখন আপনার উত্তরটি পেয়েছি তখন আমি দেখতে পাচ্ছি যে আমি ইতিমধ্যে এটির উন্নতি করেছি! তাই দুবার ধন্যবাদ।
ব্যবহারকারী1732313

8

অন্য কোনও উত্তর আমার পক্ষে কাজ করেনি, তাই আমি এখানে পাওয়া প্রকৃত অ্যাপকম্প্যাট ভি 7 স্টাইলগুলি একবার দেখেছি

আপনি যদি বেস.বিজেট.অ্যাপকম্প্যাট.অ্যাকশনবার স্টাইলটি দেখেন তবে এটিতে রয়েছে:

<item name="contentInsetStart">@dimen/abc_action_bar_content_inset_material</item>
<item name="contentInsetEnd">@dimen/abc_action_bar_content_inset_material</item>

সুতরাং স্পষ্টতই আমাদের কেবল আমাদের নিজস্ব অ্যাকশন বার স্টাইলে সেই বৈশিষ্ট্যগুলি ওভাররাইড করা দরকার:

<style name="ActionBar" parent="@style/Base.Widget.AppCompat.ActionBar">
        <item name="contentInsetStart">0dp</item>
        <item name="contentInsetEnd">0dp</item>
</style>

এটি আমার পক্ষে দুর্দান্ত কাজ করেছে, আশা করি এটি অন্যকেও সহায়তা করবে।


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

1

মনিটরের বিরুদ্ধে আমার মাথাটা মারার পরে, এটি আমার পক্ষে কাজ করেছিল worked

 Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
        toolbar.setContentInsetStartWithNavigation(0);
        toolbar.setContentInsetEndWithActions(0);
        toolbar.setContentInsetsAbsolute(0, 0);
        toolbar.setPadding(0, 0, 0, 0);

গেটকাস্টমভিউ () .পেট প্যারেন্ট () কৌশলটি কী করেছিল


0

আমি আজও এই সমস্যার মুখোমুখি হয়েছি, তারপরে আমি জানতে পেরেছিলাম যে আমি ছিলাম res/values-v21/styles.xml যে আমার প্রকল্পের ভিতরে আমার রয়েছে যা অ্যান্ড্রয়েড স্টুডিও দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন হয়েছিল এবং এটিই এর কারণ।

কেন?

কারণ আমার res/values-v21/styles.xml লিখিত সামগ্রীটি ছিল:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="BaseAppTheme" parent="android:Theme.Material.Light">
    </style>
</resources>

এবং আমার res/values/styles.xml কিছু অন্তর্ভুক্ত:

<style name="BaseAppTheme" parent="android:Theme.Holo.Light">
    <!-- Customize your theme here. -->
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:soundEffectsEnabled">false</item>
</style>

তারপরে যখন আমি ললিপপটিতে আমার অ্যাপটি চালাতাম, তখন res/values-v21/styles.xml এটি ব্যবহার করা হয়েছিল এবং এর ফলে ওপি-র সঠিক সমস্যা দেখা দিয়েছে। সুতরাং আমি একটি সহজ স্থির এসেছি কেবল মুছে ফেলা হচ্ছে:

    <style name="BaseAppTheme" parent="android:Theme.Material.Light">
    </style>

ভিতরে res/values-v21/styles.xml


0

যথাযথ:

 ActionBar actionBar = getSupportActionBar();
                actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
                actionBar.setCustomView(R.layout.actionbar_layout);
                Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
                    toolbar.setContentInsetsAbsolute(0, 0);
                    toolbar.setPadding(0, 0, 0, 0);

সঠিক সরঞ্জামদণ্ডটি আমদানি করা নিশ্চিত করুন - android.support.v7.widget.Toolbar;


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