অ্যান্ড্রয়েড অ্যাকশন বার ওভারফ্লো দেখাচ্ছে না


90

আমার অ্যাপে 3 টি আইটেম সহ অ্যাকশন বার রয়েছে।

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

এখানে প্রাসঙ্গিক কোড: list_menu.xML ml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_insert"
    android:icon="@android:drawable/ic_menu_add"
    android:title="@string/menu_insert" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_call"
    android:icon="@android:drawable/ic_menu_call"
    android:title="@string/menu_call" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_agenda"
    android:icon="@android:drawable/ic_menu_agenda"
    android:title="@string/menu_agenda" 
    android:showAsAction="ifRoom|withText"/>
</menu>

ক্রিয়াকলাপ.জভা

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater mi = getMenuInflater();
    mi.inflate(R.menu.list_menu, menu);
    return true;
}

120
আপনার ডিভাইসে যদি মেনু-বোতাম থাকে তবে ওভারফ্লো-আইকনটি প্রদর্শিত হবে না। আপনি কোন ডিভাইসে আছেন?
রিনিয়ের

4
আমি যে ভার্চুয়াল ডিভাইসটি পরীক্ষা করছি তার মেনু বোতামটি প্রকৃতপক্ষে রয়েছে, এটি ক্লিক করেছে এবং অনুপস্থিত আইটেমটি প্রদর্শিত হয়েছে, ধন্যবাদ!
ম্যাটস রায়মেন

4
@Rininier আমি অ্যাকশনবারেরলক ব্যবহার করছি using গ্যালাক্সি এসে চলমান ২.৩ এ এটি প্রদর্শিত হয়, গ্যালাক্সি এসআইআই চলমান ৪.০ এ এটি প্রদর্শিত হয় না। দুজনেরই এইচডাব্লু মেনু বোতাম রয়েছে।
মিস্টার স্মিথ

4
আমি নিশ্চিত করতে চেয়েছিলাম যে এটি আমাকে বিভ্রান্ত করেছিল যে আমার একটি নেক্সাস 7 এ ওভারফ্লো আইকনটি গ্যালাক্সি নোট II এ না কিনে had নোটটিতে একটি মেনু বোতাম ছিল। ধন্যবাদ!
বিসুটনার

@ রেইনিয়ার দয়া করে একই সমস্যার মুখোমুখি করতে আমাকে সাহায্য করুন আমাকে কী করা উচিত?
রূপেশ

উত্তর:


125

আপনি যদি তিনটি বিন্দু প্রদর্শন করতে চান তবে ডিভাইস মেনু বোতাম নির্বিশেষে! তারপরে আপনি এই অ্যাপ্লিকেশন ক্লাসে এই পদ্ধতিটি কল করতে পারেন 'অনক্রিট পদ্ধতি-

private void makeActionOverflowMenuShown() {
    //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
    try {
        ViewConfiguration config = ViewConfiguration.get(this);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if (menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception e) {
        Log.d(TAG, e.getLocalizedMessage());
    }
}

32
এটি একটি ভয়ঙ্কর হ্যাক যা প্ল্যাটফর্মের বাকী অ্যাপগুলির সাথে সামঞ্জস্যতা ভেঙে দেয়। এটা করো না.
12

19
এটি দু'টি দুষ্টতা কম বলে মনে হচ্ছে। বর্তমানের আচরণটি গ্রহণযোগ্য নয়।
biorbnA

6
উপচে পড়ার অনুমতি দেওয়ার এক দুর্দান্ত উপায়, মেনু হার্ড কীটি আর সহ্য করা উচিত নয়।
নেক্রোনেট

4
এটি দুর্দান্ত কাজ করে! এমনকি ব্যবহারকারীরা হার্ডওয়্যার মেনু বোতাম টিপলে (যা উজ্জ্বল) এমনকি যদি আপনি দুবার মেনু সাউন্ড এফেক্ট শুনতে পাবেন তাও কাজ করে .. কেউ কীভাবে একবার এটি কেবলমাত্র শব্দ করা যায় তা কি জানেন?
ব্রুস

4
এটি একটি হ্যাক নয়। অ্যান্ড্রয়েডে এটি কেবল 2 + ​​2 নয়, হ্যাকগুলিকে কী কল করতে হবে তা ডেভদের জানতে হবে। প্রতিবিম্বটি জাভা প্রক্রিয়াগুলি ব্যবহার করে সময় সাশ্রয় করছে, অন্যথায় আপনি আপনার অভ্যন্তরীণ ক্লাসগুলিতে 24/7 প্রসঙ্গটি পেরিয়ে যাচ্ছেন বা এওএসপি অনন্তের অনুকূলিতকরণ করবেন। আমার কাছে এই সমাধানটি ওভাররাইড করার সমস্যাটি সমাধান করে এবং টোনস এওএসপি কাস্টম সামগ্রী এবং লিঙ্কযুক্ত, ব্যক্তিগত সংস্থাগুলি কেবল পিউরিস্টদের পরিষ্কার বলে বিবেচনা করে তা অন্তর্ভুক্ত করে। আপনি কি জানতেন আপনি ছোট তালিকাগুলির জন্য ধারাবাহিকভাবে সক্ষম করা FASTSCROLL জোর করতে পারবেন না? আমি প্রতিবিম্বটি ব্যবহার করার আগে এটির জন্য আমার একটি সম্পাদনা করার জন্য 10+ AOSP সংস্থানগুলি অনুলিপি করা দরকার।
leRobot

53

অ্যাকশন বার

res / মেনু / মেনু.এক্সএমএল

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

    <!-- Search / will display always -->
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="always"
        android:title="@string/action_search"/>

    <!-- Location Found -->
    <item
        android:id="@+id/action_location_found"
        android:icon="@drawable/ic_action_location_found"
        android:showAsAction="always"
        android:title="@string/action_location_found"/>

    <!-- More -->
    <item
        android:id="@+id/a_More"
        android:icon="@drawable/ic_action_overflow"
        android:showAsAction="always"
        android:title="More">
        <menu>

            <!-- Refresh -->
            <item
                android:id="@+id/action_refresh"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_refresh"/>

            <!-- Help -->
            <item
                android:id="@+id/action_help"
                android:icon="@drawable/ic_action_help"
                android:showAsAction="never"
                android:title="@string/action_help"/>

            <!-- Check updates -->
            <item
                android:id="@+id/action_check_updates"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_check_updates"/>
        </menu>
    </item>

</menu>

মেইনএ্যাকটিভিটি.জভা

public class MainActivity extends Activity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

}

অ্যাকশন বার আইকন সেটটি ডাউনলোড করুন


4
@ রিনিয়ার মন্তব্যটি দেখুন, এটি সত্য "আপনার ডিভাইসে মেনু বোতাম থাকলে ওভারফ্লো-আইকনটি প্রদর্শিত হবে না"।
আহমদ দ্বাইক 'ওয়ার্লক'

আমি মেনু বোতামযুক্ত ডিভাইসে পরীক্ষা করছি এবং আমার ক্ষেত্রে ওভারফ্লো দেখাচ্ছে। আমি android:showAsAction="always"আরও আইটেমটির জন্য ব্যবহার করি
কিরীট ওয়াঘেলা

আপনি কোন ডিভাইসে এটি পরীক্ষা করেছেন? আমি একটি নিও ভি
এক্স্পেরিয়া

4
দ্রষ্টব্য: আপনার আইটেমটি যা আপনার ওভারফ্লো মেনুতে স্ফীত করে showAsAction = "সর্বদা"
কিরীট ওয়াঘেলা

4
পুরানো এসডিসিতে অ্যান্ড্রয়েড নেমস্পেসে শোএসএশন উপলব্ধ নয়। এটিকে কাটিয়ে উঠতে এই লিঙ্কটি বিকাশকারী.অ্যান্ড্রয়েড / ট্রেনিং / বেসিক্স / অ্যাকশনবার্বা / অনুসরণ করুন । এই এনএস স্কিমাস.অ্যান্ড্রয়েড.com / apk / res-auto যুক্ত করার পরে , উপরের কৌশলটি আমার জন্য পুরোপুরি সূক্ষ্মভাবে কাজ করেছে
সিডাইন

42

আমি বুঝতে পারি এটি কোনও ওভারফ্লো মেনু নয়, তবে এটি একই রকম। ঠিক আছে, এটি সহজ কিন্তু খুঁজে বের করা কঠিন ছিল।

আপনার প্রথমে একটি মেনু আইটেমের দরকার যা আপনি ওভারফ্লো ইনফ্লেটার হিসাবে ব্যবহার করতে চান। উদাহরণ

<item
        android:id="@+id/a_More"
        android:icon="@drawable/more"
        android:showAsAction="always"
        android:title="More">
        </item>

আপনার আইটেমটি একবার হয়ে গেলে ওভারফ্লো মেনুতে আপনার পছন্দসই আইটেম যুক্ত একটি উপ-মেনু যুক্ত করুন। উদাহরণ:

<item
    android:id="@+id/a_More"
    android:icon="@drawable/more"
    android:showAsAction="always"
    android:title="More">
    <menu>
        <item
            android:id="@+id/aM_Home"
            android:icon="@drawable/home"
            android:title="Home"/>
    </menu>
</item>

ক্লিক করার পরে এটি অন্যান্য আইটেমগুলিতে স্ফীত হবে। আমার অ্যাপ্লিকেশনটি অ্যাকশনবার্লক্লক ৪.০ ব্যবহার করছে সুতরাং এটি আপনার পক্ষে কাজ করার আগে আপনাকে "স্প্লিটএকশনবার" অ্যাক্সেস করতে হবে। (তবুও ডিফল্ট অ্যান্ড্রয়েড অ্যাকশনবারে কাজ করবে)

এখানে কীভাবে রয়েছে: আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ফাইলে, আপনাকে ওভারফ্লো মেনুতে যে ক্রিয়াকলাপটি লাগবে তার অধীনে আপনার এই কোডটি যুক্ত করতে হবে।

android:uiOptions="splitActionBarWhenNarrow"

দ্রষ্টব্য: আপনার আইটেমটি আপনার ওভারফ্লো মেনুতে আবশ্যকshowAsAction="always"

ভোলা! আপনার একটি ওভারফ্লো মেনু আছে! আশা করি আমি আপনাকে সাহায্য করেছি :)


4
মেনু বোতাম হ্যাক চেয়ে ভাল সমাধান।
অলিউস্ট

26

হার্ডওয়্যার মেনু বোতামযুক্ত ডিভাইসগুলিতে (গ্যালাক্সি এস 3, স্যামসাংয়ের মতো অনড় ...) ওভারফ্লো মেনু হার্ডওয়্যার মেনু বোতামটি ব্যবহার করে 'traditionalতিহ্যবাহী' মেনু হিসাবে আচরণ করে।


4
পুরানো উত্তর, তবে সামঞ্জস্য লাইব্রেরির সাথে কেবল খুব বিজোড় ফলাফলগুলিতেই হোঁচট খায়: হার্ডওয়্যার বোতাম সহ 3 টি ডিভাইস, নোট 3 নব্য = ওভারফ্লো মেনু প্রদর্শিত হবে, মেনু বোতামটি কাজ করে না, নোট 1 = কোনও ওভারফ্লো নয়, মেনু বোতাম কাজ করে, গ্যালাক্সি এস 3, না উপচে পড়া, মেনু বোতাম কাজ করে না! এটা পাগলামি.
3c71

5

আপনি যখন "ওভারফ্লো" মেনু বলছেন, আপনি কি বোঝাতে চাইছেন যে আরও তিনটি বিন্দু শেষ পর্যন্ত প্রদর্শিত হবে যে আরও বেশি আইটেম রয়েছে .... বা আপনি কি বোঝাচ্ছেন যে বিভক্ত ক্রিয়া বারটি ওভারফ্লো আইটেমগুলির নীচে প্রদর্শিত হবে?

আপনি যদি স্প্লিট অ্যাকশন বারটি বোঝাতে চান তবে আপনার এটি আপনার ক্রিয়াকলাপের ম্যানিফেস্ট ফাইলটিতে যুক্ত করা উচিত

android:uiOptions="splitActionBarWhenNarrow"

ডিফল্টরূপে, তিনটি বিন্দু ওভারফ্লো মেনু স্বয়ংক্রিয়ভাবে হওয়া উচিত, সুতরাং আপনার উপরে সরবরাহ করা তথ্য থেকে সমস্যাটি কী তা বলা শক্ত।


আমার মানে তিনটি বিন্দু এটি আইটেমগুলির কারণে এটির মতো নয়, কারণ যখনই আদেশের আইটেমগুলি পরিবর্তন করা হয়, এটি প্রথম 2 আইকন দেখানো হয়
ম্যাট রাইমেন

প্রকৃত সমস্যাটি নির্ধারণ করতে সক্ষম হওয়ার জন্য আমার কি অতিরিক্ত তথ্য সরবরাহ করা উচিত?
ম্যাটস রায়মেন

আপনার minSdkVersion, लक्ष्यSdkVersion, এবং আপনি যে সংস্করণটি পরীক্ষা করছেন তা কী?
স্পার্কি

4
আপনার ডিভাইসে কি মেনুর জন্য শারীরিক বোতাম আছে বা সেগুলি গ্যালাক্সি নেক্সাস ফোনের মতো ভার্চুয়াল বোতামগুলি রয়েছে? আমি মনে করি আপনার ফোনে শারীরিক বোতাম না থাকলে কেবলমাত্র তিনটি বিন্দু প্রদর্শিত হবে।
wnafi

5

অ্যাকশনবারকম্প্যাটে সর্বদা অ্যাকশন ওভারফ্লো (তিনটি বিন্দু) প্রদর্শন করতে:
মেনু ফাইলে, উদাহরণ:
main.xML

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_about"
        android:title="@string/action_about"
        app:showAsAction="never"/>

</menu>

এবং ক্রিয়াকলাপ ফাইলটিতে:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

এটা আমার জন্য ভাল কাজ করেছে।
গুগল নেক্সাস এস, স্যামসুং এস 3 এ পরীক্ষিত।


3

এটি প্রদর্শিত হয় যে মেনু বোতামযুক্ত ডিভাইসে অ্যাকশনবারে ওভারফ্লো মেনু প্রদর্শিত হয় না। এছাড়াও এপিআই স্তরের 14 (4.0+) এর আগে কোনও ডিভাইসে একটি হার্ডওয়্যার মেনু বোতাম আছে কিনা তা আমাদের জানার কোনও উপায় নেই ।

এই সমাধানটি একটি ওভারফ্লো বোতাম যুক্ত করে android.support.v7.app.ActionBarযা প্রাক-হানিকম্বের (<3.0) কেবলমাত্র মান বিকল্প বিকল্পগুলি মেনু খোলায়, অন্যথায় এটি সিস্টেমে ছেড়ে যায়। যে কোনও ক্ষেত্রে আপনি সমস্ত ক্রিয়াকলাপের মধ্যে alwaysবা চয়ন করতে পারেন ifRoom

অ্যাকশন বার আইকন প্যাক থেকে ওভারফ্লো আইকন পান ।

একটি মেনু যুক্ত করুন (শিরোনাম হিসাবে কিছু অ-প্রাসঙ্গিক অংশগুলি সাজানো, ক্রম ইত্যাদি অর্ডার করা)

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

<item
    android:id="@+id/action_overflow"
    android:orderInCategory="100"
    android:icon="@drawable/ic_action_overflow"
    app:showAsAction="always" />

<item
    android:id="@+id/action_first"
    app:showAsAction="always" />

<item
    android:id="@+id/action_second"
    app:showAsAction="ifRoom" />

</menu>

3.0+ এ আমাদের ওভারফ্লো ক্রিয়াটি সরান

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        menu.removeItem(R.id.action_overflow);
    }
    return super.onPrepareOptionsMenu(menu);
}

অবশেষে Activity.openOptionsMenu()ওভারফ্লো ক্রিয়া থেকে কল করুন ।

Er কোন. আপনি openOptionsMenu()মেনু বোতাম থেকে কল করতে পারবেন না ... তবে আপনি যদি AndroidAnnotations ব্যবহার করছেন তবে আপনি সহজেই কাজটি করেছেন:

@OptionsItem
void action_overflow() {
    openOptionsMenuDeferred();
}

@UiThread
void openOptionsMenuDeferred() {
    openOptionsMenu();
}

যদি না হয় তবে আপনার এই জাতীয় কিছু করা উচিত I

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == id.action_overflow) {
        openOptionsMenuDeferred();
        return true;
    }
}

private Handler handler = new Handler(Looper.getMainLooper());
public void openOptionsMenuDeferred() {
    handler.post(new Runnable() {
        @Override
        public void run() {
            openOptionsMenu();
        }
    }
    );
}


2

xmlns:your_app_name="http://schemas.android.com/apk/res-auto"মেনু ট্যাগের ভিতরে এবং পরিবর্তে রাখুনandroid:showAsAction="always" ব্যবহার করুনyour_app_name:showAsAction="always"

যেমন

<item
    android:id="@+id/action_search"
    android:icon="@drawable/icon_search"
    android:title="@string/search"
    your_app_name:showAsAction="ifRoom"/>

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