Android: добавление в меню настроек динамически - PullRequest
1 голос
/ 12 января 2012

Я просто пытаюсь добавить другие действия в свое меню параметров. У меня есть приложение, которое отображает его меню, определенное как

public class OptionsMenuTesterActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            super.onCreateOptionsMenu(menu);

            // Create an Intent that describes the requirements to fulfill, to be included
            // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE. 
            Intent intent = new Intent(null,getIntent().getData());
            intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

            // Search for, and populate the menu with, acceptable offering applications.
            menu.addIntentOptions(
                    Menu.CATEGORY_ALTERNATIVE,  // Menu group 
                 0,      // Unique item ID (none)
                 0,      // Order for the items (none)
                 this.getComponentName(),   // The current Activity name
                 null,   // Specific items to place first (none)
                 intent, // Intent created above that describes our requirements
                 0,      // Additional flags to control items (none)
                 null);  // Array of MenuItems that corrolate to specific items (none)

            return true;
        }
    }

, теперь я создал другое простое приложение с одним действием, и его androidmaifest выглядит следующим образом

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.idg.test.dynamicoptionsmenu"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".DynamicOptionsMenuTesterActivity"
            android:label="@string/app_name" >
            <intent-filter label="test menu">
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                 <category android:name="android.intent.category.ALTERNATIVE" />

            </intent-filter>
        </activity>
    </application>

</manifest>

У меня запущены оба приложения.Но когда я нажимаю на меню первого приложения, я ничего не вижу. Можете ли вы помочь мне рассказать, что мне здесь не хватает.

Ответы [ 2 ]

0 голосов
/ 29 октября 2014

Вопрос немного старше, но мне потребовалось некоторое время, чтобы его завершить, так что, возможно, это сэкономит другим время и разочарование. Надеюсь, это поможет ...

Вот что я сделал, чтобы создать динамическое меню, чтобы предлагать все доступные опции для обмена изображениями. Я создал свое собственное топменю вместо использования ActionBar. Мой пункт меню начинается с ImageButton в onCreate методе Activity ...

    ImageButton shareBtn = (ImageButton)findViewById(R.id.shareBtn);
    shareBtn.setOnClickListener(new View.OnClickListener() {

        // receive launchables (to build menu items)
        List<ResolveInfo> launchables = getLaunchablesToShareWith();
        PackageManager pm=getPackageManager();

        @Override
        public void onClick(View v) {
            //Creating the instance of PopupMenu
            PopupMenu popup = new PopupMenu(getApplicationContext(), v);

            //enable icons using Reflection...
            try {
                Field[] fields = popup.getClass().getDeclaredFields();
                for (Field field : fields) {
                    if ("mPopup".equals(field.getName())) {
                        field.setAccessible(true);
                        Object menuPopupHelper = field.get(popup);
                        Class<?> classPopupHelper = Class.forName(menuPopupHelper
                                .getClass().getName());
                        Method setForceIcons = classPopupHelper.getMethod(
                                "setForceShowIcon", boolean.class);
                        setForceIcons.invoke(menuPopupHelper, true);
                        break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }


            //Inflating the Popup using xml file
            popup.getMenuInflater().inflate(R.menu.popupmenu_your_activity, popup.getMenu());

            // add items
            for (ListIterator<ResolveInfo> iterator = launchables.listIterator(); iterator.hasNext(); ) {

                // extract data from launchables
                ResolveInfo resolveInfo = iterator.next();
                String title = resolveInfo.activityInfo.applicationInfo.loadLabel(pm).toString();
                String packageName = resolveInfo.activityInfo.applicationInfo.packageName;
                Drawable appIcon = null;
                try {
                    appIcon = pm.getApplicationIcon(packageName);
                } catch (PackageManager.NameNotFoundException e) {
                    e.printStackTrace();
                    continue;
                }

                // create & add item
                popup.getMenu().add(0, 0, 0, title)
                                .setIcon(appIcon)
                                .setIntent( getShareIntent().setPackage(packageName) )
                                .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                                    public boolean onMenuItemClick(MenuItem item) {
                                        prepareImageToShare(true);
                                        startActivity(item.getIntent());
                                        return true;
                                    }
                                });
            }

            popup.show();
        }
    });

Чтобы создать список запускаемых программ:

private List<ResolveInfo> getLaunchablesToShareWith() {
    PackageManager pm = getPackageManager();

    Intent intent = new Intent(Intent.ACTION_SEND, null);
    intent.setType("image/png");

    List<ResolveInfo> launchables=pm.queryIntentActivities(intent, 0);
    Collections.sort(launchables, new ResolveInfo.DisplayNameComparator(pm));

    return launchables;
}

Для создания общего ресурса Intent:

private Intent getShareIntent() {
    // File helper returns something like return Uri.parse("file:///storage/emulated/0/YourApp/output/image.png");
    Uri imageUri = FileHelper.getOutputPathAsUri(Files.SHARED_OUTPUT_FILE.getFilename(), Paths.OUTPUT_FOLDER_PATH.getPath(), true); 

    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setData(imageUri);
    shareIntent.setType("image/png");
    shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);

    return shareIntent;
}

Файл макета меню ( popupmenu_your_activity.xml ) выглядит следующим образом:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="your.package.YourActivity" >

    <!-- popup menu with dynamic content -->

</menu>
0 голосов
/ 21 июля 2012
public void openOptionsMenu() { 
    // TODO Auto-generated method stub 
    super.openOptionsMenu(); 
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    //call the base class to include system menus
    super.onCreateOptionsMenu(menu);

        int group1 = 1;
        MenuItem bakchome = menu.add(group1,1,1,"title");
        bakchome.setIcon(R.drawable.ic_menu_add);

    return true;
}

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

        Intent intent1 = new Intent(getApplicationContext(), yourintent.class);
        intent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent1);
            break;

        }

    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...