মেনু বোতাম সহ ডিভাইসগুলিতে ওভারফ্লো মেনু কীভাবে ব্যবহার করা যায়


159

আমি মেনু আইটেম যে ওভারফ্লো মেনু মধ্যে ActionBar চলতে চলতে (এক যে ব্যবস্থা বার মেনু বাটন থেকে পৌঁছে হয়) মধ্যে মাপসই করা হবে না সব আছে চাই এমনকি ডিভাইস উপর না একটি মেনু বাটন আছে । এটি ব্যবহারকারীদের পৃথক মেনু তালিকায় ফেলে দেওয়ার চেয়ে অনেক বেশি স্বজ্ঞাত বলে মনে হচ্ছে যার জন্য ব্যবহারকারীকে স্পর্শ (স্ক্রিন) ইন্টারঅ্যাকশন থেকে একটি বোতাম ভিত্তিক মিথস্ক্রিয়ায় ঝাঁপিয়ে পড়ার প্রয়োজন হয় কেবলমাত্র অ্যাকশনবারের বিন্যাসটি বারে এগুলি ফিট করতে পারে না।

এমুলেটরটিতে আমি "হার্ডওয়্যার ব্যাক / হোম কী" মানটি "না" তে সেট করতে এবং এই প্রভাবটি পেতে পারি। আমি একটি আসল ডিভাইসের কোডে এটি করার একটি উপায় অনুসন্ধান করেছি যার মেনু বোতাম রয়েছে তবে এটি জরিমানা করতে পারে না। আমাকে কি কেউ সাহায্য করতে পারবেন?

উত্তর:


54

সম্পাদনা: শারীরিক মেনু বোতামের পরিস্থিতির জন্য উত্তর দিতে সংশোধিত।

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

"... মেনু হার্ডওয়্যার কী থেকে অ্যাকশন ওভারফ্লো উপলব্ধ The

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

ডিভাইসগুলির মধ্যে ধারাবাহিকতার বিষয়টি সমাধান করার জন্য: আপনার অ্যাপটি একই ডিভাইসের প্রতিটি অ্যাপ্লিকেশনের সাথে ধারাবাহিকভাবে আচরণ করে এমনটি তার ব্যবহারকারীর অভিজ্ঞতার চেয়ে বেশি গুরুত্বপূর্ণ যা তার তুলনায় এটি সমস্ত ডিভাইসগুলিতে নিজের সাথে ধারাবাহিকভাবে আচরণ করে।


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

41
আসুন এই কথোপকথনে প্রবেশ করুন এবং আলোচনা করুন: আমি জানি এটি নকশা দ্বারা প্রতিরোধ করা হয়েছে (আমি নকশার নির্দেশিকা পড়ি)। তবে আমি%% $ /% # + এর মতই মনে করি। উদাহরণস্বরূপ: ব্যবহারকারী একটি গ্যালাক্সি নেক্সাস (-> ডাব্লু ওভারফ্লো) থেকে একটি নেক্সাস ওনে (ডাব্লু 4.0 / -> কোনও ওভারফ্লো) স্যুইচ করছেন। আমি বাজি ধরছি ব্যবহারকারী আর মেনু আইটেমগুলি খুঁজে পাবে না। যে কারণে আমি সমস্ত ডিভাইসের জন্য একই ব্যবহার চাই। সুতরাং, আমি পলপ হিসাবে একই সমস্যাটি শেষ করছি। কোনও পরিষ্কার পরিচ্ছন্নতা পাওয়া যায় না?
23:25

10
আমিও প্রথমে ডিজাইন গাইড পড়ি। আমার কাছে এটি সমর্থন প্যাকেজে ডিজাইনের একটি খারাপ পছন্দ ছিল। ব্যবহারকারীদের বাটন থেকে লক্ষ্যমাত্রা পরিবর্তনের জন্য আরও ভাল কৌশল (উদ্দেশ্য, ডান?) হ'ল এটিকে বাড়াবাড়ি করা, কার্যকারিতাটি স্ক্রিনে বাটনে রাখা। এখনকার জিনিসগুলি হিসাবে, বোতামটি সমস্ত মেনু পছন্দগুলি তালিকাভুক্ত করে না, কেবলমাত্র অ্যাকশনবারে নয়, সুতরাং এই নকশাটি অ্যাকশনবারে কোনও মসৃণ রূপান্তরকে সমর্থন করে না বা অ্যাকশনবারে যুক্ত করার আগে এটি যা করত তা করে না ( সমস্ত মেনু প্রদর্শন করুন পছন্দ)। আমি সন্দেহ করি যে আপনি ঠিক আছেন এবং কোনও সাধারণ কর্মচক্র নেই।
পলপি

18
গুগল তাদের নতুন গুগল + অ্যাপ্লিকেশনগুলিতে এর বিপরীতে। এটি ডিভাইস নির্বিশেষে এটির ওভারফ্লো আইটেমটি রয়েছে .. তবুও তারা এখনও বিকাশকারীদের আমার জ্ঞানের জন্য এটির বিরুদ্ধে পরামর্শ এবং পরামর্শ থেকে বিরত রাখে।
কার্ল

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

323

আপনি এই ছোট হ্যাকটি এখানেও ব্যবহার করতে পারেন:

try {
    ViewConfiguration config = ViewConfiguration.get(this);
    Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
    if (menuKeyField != null) {
        menuKeyField.setAccessible(true);
        menuKeyField.setBoolean(config, false);
    }
} catch (Exception ignored) {
}

এটি রাখার ভাল জায়গা onCreateহ'ল আপনার অ্যাপ্লিকেশন ক্লাসের ম্যাথড।

এটি অ্যাপটিকে ওভারফ্লো মেনুটি প্রদর্শন করতে বাধ্য করবে। মেনু বোতামটি এখনও কাজ করবে তবে এটি ডানদিকের উপরের অংশে মেনুটি খুলবে।

[সম্পাদনা] যেহেতু এটি এখন বেশ কয়েকবার এসেছে: এই হ্যাকটি অ্যান্ড্রয়েড in.০ এ প্রবর্তিত নেটিভ অ্যাকশনবারের জন্যই কাজ করে, অ্যাকশনবারেরলক নয়। ওভারফ্লো মেনুটি প্রদর্শিত হবে কিনা তা সিদ্ধান্ত নিতে পরবর্তীকর্তারা তার নিজস্ব অভ্যন্তরীণ যুক্তি ব্যবহার করে। আপনি যদি এবিএস ব্যবহার করেন, সমস্ত প্ল্যাটফর্ম <4.0 টি এ বি এস দ্বারা পরিচালিত হয় এবং এটির পক্ষে যুক্তিযুক্ত হয়। হ্যাক এখনও অ্যান্ড্রয়েড 4.0.০ বা তার বেশি সংখ্যক ডিভাইসের জন্য কাজ করবে (আপনি অ্যান্ড্রয়েড 3.x নিরাপদে উপেক্ষা করতে পারবেন, যেহেতু মেনু বোতামের সাথে কোনও ট্যাবলেট সেখানে নেই)

এখানে একটি বিশেষ ফোর্স ওভারফ্লো-থিম রয়েছে যা মেনুটিকে এবিএস-এ জোর করবে, তবে আকর্ষণীয়ভাবে এটি ভবিষ্যতের সংস্করণগুলিতে জটিলতার কারণে এটি মুছে ফেলা যাচ্ছে


4
আমি সোর্স কোডটি দেখেছি। অননুমোদিত বৈশিষ্ট্যগুলির ট্রেজার গ্রোভ :) কেবলমাত্র নিশ্চিত করুন যে আপনার মতো জিনিসগুলির জন্য কার্যকর একটি ফলব্যাক রয়েছে।
টিমো ওহর

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

4
@ সপ্তাহের মন্তব্যটি সম্পর্কে আমি দেরি করে ফেলেছি, তবে আমি স্রেফ অ্যাকশনবারকম্প্যাটটির সাম্প্রতিকতম সংস্করণ দিয়ে এটি চেষ্টা করেছি এবং এটি কাজ করেছে।
জ্যাকোভাইফেনেটেড

3
এটি স্যামসাং গ্যালাক্সি এস 3 এবং এস 4-তে কাজ করে, তবে এলজি জি 2-তে নয় (সন্দেহ হয় তারা ওভারফ্লো মেনু বোতামটি দেখানোর জন্য চেকটি কোডিং করছে)
ডিভিডি

18
সুন্দর! যদি Eclipse আপনাকে 6 টি আলাদা আলাদা আমদানি পছন্দ করে তবে এটি বেছে নেওয়ার জন্য Fieldচয়ন করুন java.lang.reflect.Field;)
ইউজিন ভ্যান ডের মেরভে

35

আমি এটির মতো আমার মেনুটি সংজ্ঞায়িত করে এটি ব্যবহার করতে চাই (আমার উদাহরণে ব্যবহৃত অ্যাকশনবারশারলক আইকনটিও):

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

    <item
        android:id="@+id/menu_overflow"
        android:icon="@drawable/abs__ic_menu_moreoverflow_normal_holo_light"
        android:orderInCategory="11111"
        android:showAsAction="always">
        <menu>
            <item
                android:id="@+id/menu_overflow_item1"
                android:showAsAction="never"
                android:title="@string/overflow_item1_title"/>
            <item
                android:id="@+id/menu_overflow_item2"
                android:showAsAction="never"
                android:title="@string/overflow_item2_title"/>
        </menu>
    </item>

</menu>

আমি স্বীকার করি যে এর জন্য আপনার এক্সএমএলে ম্যানুয়াল "ওভারফ্লো-পরিচালনা" দরকার হতে পারে তবে আমি এই সমাধানটি দরকারী বলে মনে করি।

আপনি আপনার ক্রিয়াকলাপে ওভারফ্লো মেনু খুলতে ডিভাইসকে এইচডাব্লু বোতাম ব্যবহার করতে বাধ্য করতে পারেন:

private Menu mainMenu;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // TODO: init menu here...
    // then:
    mainMenu=menu;
    return true;
}

@Override
public boolean onKeyUp(int keycode, KeyEvent e) {
    switch(keycode) {
        case KeyEvent.KEYCODE_MENU:
            if (mainMenu !=null) {
                mainMenu.performIdentifierAction(R.id.menu_overflow, 0);
            }
    }

    return super.onKeyUp(keycode, e);
}

:-)


2
ওভারফ্লো মেনু খুলতে কীভাবে এইচডাব্লু বোতাম ব্যবহার করবেন?
ব্লেডফুরি

1
এইচডাব্লু বোতাম দিয়ে ওভারফ্লো মেনু খোলার জন্য আমার আপডেট হওয়া উত্তরটি দেখুন। :)
বের্ক

11

আপনি যদি সমর্থন লাইব্রেরি ( android.support.v7.app.ActionBar) থেকে অ্যাকশন বারটি ব্যবহার করছেন তবে নিম্নলিখিতটি ব্যবহার করুন:

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

    <item
        android:id="@+id/menu_overflow"
        android:icon="@drawable/icon"
        yourapp:showAsAction="always"
        android:title="">
        <menu>
            <item
                android:id="@+id/item1"
                android:title="item1"/>
            <item
                android:id="@+id/item2"
                android:title="item2"/>
        </menu>
    </item>

</menu>

সমর্থন লাইব্রেরিটি ব্যবহার করার সময় আমি এটিও বাস্তবায়ন করেছি এবং এটি 3.0 ও পোস্ট উভয় ডিভাইসে ঠিক আছে
লিফকাটার

7

এ জাতীয় পদ্ধতি অ্যান্ড্রয়েড বিকাশকারী ডিজাইন সিস্টেম দ্বারা প্রতিরোধ করা হয়েছে, তবে আমি এটি পাস করার একটি উপায় খুঁজে পেয়েছি:

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

<item android:id="@+id/pick_action_provider"
    android:showAsAction="always"
    android:title="More"
    android:icon="@drawable/ic_action_overflow"
    android:actionProviderClass="com.example.AppPickActionProvider" />

এরপরে, 'অ্যাপপিকএকশনপ্রভাইডার' নামে একটি শ্রেণি তৈরি করুন এবং এতে নিম্নলিখিত কোডটি অনুলিপি করুন:

    package com.example;

import android.content.Context;
import android.util.Log;
import android.view.ActionProvider;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.SubMenu;
import android.view.View;

public class AppPickActionProvider extends ActionProvider implements
        OnMenuItemClickListener {

    static final int LIST_LENGTH = 3;

    Context mContext;

    public AppPickActionProvider(Context context) {
        super(context);
        mContext = context;
    }

    @Override
    public View onCreateActionView() {
        Log.d(this.getClass().getSimpleName(), "onCreateActionView");

        return null;
    }

    @Override
    public boolean onPerformDefaultAction() {
        Log.d(this.getClass().getSimpleName(), "onPerformDefaultAction");

        return super.onPerformDefaultAction();
    }

    @Override
    public boolean hasSubMenu() {
        Log.d(this.getClass().getSimpleName(), "hasSubMenu");

        return true;
    }

    @Override
    public void onPrepareSubMenu(SubMenu subMenu) {
        Log.d(this.getClass().getSimpleName(), "onPrepareSubMenu");

        subMenu.clear();

        subMenu.add(0, 1, 1, "Item1")
        .setIcon(R.drawable.ic_action_home).setOnMenuItemClickListener(this);

        subMenu.add(0, 2, 1, "Item2")
            .setIcon(R.drawable.ic_action_downloads).setOnMenuItemClickListener(this);
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch(item.getItemId())
        {
            case 1:

                // What will happen when the user presses the first menu item ( 'Item1' )

                break;
            case 2:

                // What will happen when the user presses the second menu item ( 'Item2' )

                break;

        }

        return true;
    }
}

এই পদ্ধতিটি ব্যবহার করে এবং কেবল এখানে একটি সাবমেনু ব্যবহার করার মধ্যে কী পার্থক্য রয়েছে: stackoverflow.com/a/14634780/878126 ?
অ্যান্ড্রয়েড বিকাশকারী

5

আচ্ছা আমি মনে করি আলেকজান্ডার লুকাস (দুর্ভাগ্যক্রমে) সঠিক উত্তর সরবরাহ করেছে তাই আমি এটিকে "সঠিক" হিসাবে চিহ্নিত করছি। বিকল্প উত্তর আমি এখানে যুক্ত করছি কেবলমাত্র প্রাক-স্তরের 11 থেকে স্থানান্তরিত হওয়ার সময় আপনার কোডটি কীভাবে মোকাবেলা করতে হবে সে সম্পর্কে কিছু নির্দিষ্ট পরামর্শ সহ এই বিষয়টির বরং একটি সম্পূর্ণ আলোচনা হিসাবে অ্যান্ড্রয়েড বিকাশকারী ব্লগে এই পোস্টটিতে যে কোনও নতুন পাঠককে নির্দেশ করা to নতুন অ্যাকশন বারে।

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


আমি ডিজাইনের ভুল সম্পর্কে আপনার সাথে পুরোপুরি একমত - এবং এই হতাশাকে খুঁজে পাচ্ছি!
পল হাননিসেট

1
গুগল নিজেই তার সাম্প্রতিক জি + অ্যাপ্লিকেশনটিতে এই বিধি লঙ্ঘন করতে শুরু করেছে এমনটি যদি না হয় তবে আমি এই বিষয়ে আপনার সাথে একমত হব। এবং যথাযথভাবে তাই। মেনু বোতামটি উত্তরাধিকারসূত্রে নয়, এমনকি এসজিএস 3 এর মতো নতুন ডিভাইসেও এটি রয়েছে। দুর্ভাগ্যক্রমে এখানে থাকার জন্য। এবং এটি গুরুত্ব সহকারে ব্যবহারযোগ্যতা বাধা দেয়।
টিমো ওহর

4

আপনি যা খুঁজছেন তা এটিই কিনা আমি নিশ্চিত নই, তবে আমি অ্যাকশনবারের মেনুতে একটি সাবমেনু তৈরি করেছি এবং এর আইকনটি ওভারফ্লো মেনুর আইকনটি মেলানোর জন্য সেট করেছি। যদিও এটিতে আইটেমগুলি স্বয়ংক্রিয়ভাবে প্রেরণ করা হবে না, (IE আপনি সর্বদা দৃশ্যমান এবং যা সর্বদা উপচে পড়েছে তা চয়ন করতে হবে) আমার কাছে মনে হয় যে এই পদ্ধতি আপনাকে সহায়তা করতে পারে।


2

আইসিএস পূর্ব-ইনস্টল হওয়া জিমেইল অ্যাপে, আপনার একাধিক আইটেম নির্বাচন করা থাকলে মেনু বোতামটি অক্ষম হয়ে যায়। ওভারফ্লো মেনু এখানে শারীরিক মেনু বোতামের পরিবর্তে ওভারফ্লো বোতাম ব্যবহার করে ট্রিগার করতে "বাধ্য" করা হয়েছে। অ্যাকশনবারারলক নামে একটি তৃতীয় পক্ষের লিব রয়েছে যা আপনাকে ওভারফ্লো মেনুটিকে "বলপূর্বক" করতে দেয়। তবে এটি কেবলমাত্র API স্তরের 14 বা নিম্নের (প্রাক-আইসিএস) কাজ করবে


2

আপনি যদি সরঞ্জামদণ্ডটি ব্যবহার করেন , আপনি সমস্ত সংস্করণ এবং সমস্ত ডিভাইসে ওভারফ্লো প্রদর্শন করতে পারেন, আমি কিছু 2.x ডিভাইস চেষ্টা করেছি, এটি কাজ করে।


1

দুঃখিত যদি এই সমস্যাটি মারা যায়।

ত্রুটিটি সমাধান করার জন্য আমি এখানে যা করেছি। আমি বিন্যাসে গিয়ে দুটি বার তৈরি করেছি যাতে সরঞ্জামদণ্ড রয়েছে। একটি ছিল এসডিকে সংস্করণ 8 এর জন্য একটি লেআউট এবং অন্যটি এসডিকে 21 সংস্করণ।

তারপরে আমি আমার ক্রিয়াকলাপে সরঞ্জামদণ্ডটি স্ফীত করি। আমি এসডিকে চেক করে দেখি এটি 21 বা তার বেশি ছিল কিনা। আমি তখন সংশ্লিষ্ট লেআউটটি স্ফীত করি। এটি হার্ডওয়ার বোতামটি আপনাকে বাস্তবে নকশা করে তৈরি করা সরঞ্জামদণ্ডে ম্যাপ করতে বাধ্য করে।


0

যে কেউ নতুন ব্যবহার করছেন Toolbar:

private Toolbar mToolbar;

@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);

    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);

    ...
}


@Override
public boolean onKeyUp(int keycode, KeyEvent e) {
    switch(keycode) {
        case KeyEvent.KEYCODE_MENU:
            mToolbar.showOverflowMenu();
            return true;
        }

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