Как создать Android AppWidget, который может переходить в папки главного экрана и домашнюю строку (док)?

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

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

Возможно ли, что я ищу на самом деле не виджет, а значок приложения, который каким-то образом будет включен в список виджетов (но без добавления второго значка приложения в список приложений)?

РЕДАКТИРОВАТЬ:

Огромное спасибо Kuffs за то, что направил меня в правильном направлении.

Ключ к этому заключается в том, на что Каффс указывает в манифесте:

...
<intent-filter>
    <action android:name="android.intent.action.CREATE_SHORTCUT" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
...

Как отмечает Каффс, уже одно это дает вашему приложению запись в списке виджетов. Хороший рабочий коллектив.


person Kevin Worth    schedule 10.03.2014    source источник


Ответы (2)


Виджеты можно размещать только на главном экране. Их нельзя добавить в док на главном экране. Сюда идут только иконки.

Вам нужно добавить ярлык.

Добавьте соответствующее разрешение в свой манифест.

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />

Создайте действие, которое создаст ярлык и добавит его в манифест, как показано в примере ниже.

e.g

    <activity
        android:name=".ShortcutActivity"
        android:label="@string/app_name" android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.CREATE_SHORTCUT" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

Если вы запустите это приложение сейчас, вам будет предложена возможность добавить свой ярлык, как это делают приложения Gmail/Dropbox (на экране виджета будет указано ваше новое действие по созданию ярлыка). Конечно, ваша активность должна добавлять ярлык, чтобы быть полезным.

Активность будет запущена ОС с startActivityForResult(), и поэтому она будет ожидать намерения внутри возвращаемого намерения (для использования ОС в вызове onActivityResult). Эта информация находится здесь: https://stackoverflow.com/a/11449443/1399483

Итак, создайте действие, которое создает ярлык, например:

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

    Intent i= new Intent();
    Intent shortcutActivity = new Intent(this, ActivityToLaunch.class);

    i.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutActivity);
    i.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Shortcut Title");
    i.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,Intent.ShortcutIconResource.fromContext(this, R.drawable.shortcut_icon));
    setResult(RESULT_OK, i);
    finish();
 }

Чтобы использовать собственный значок, а не ресурс для рисования, замените лишний EXTRA_SHORTCUT_ICON_RESOURCE следующим:

Bitmap bm; // Set to the image you want to use
i.putExtra(Intent.EXTRA_SHORTCUT_ICON, bm);
person Kuffs    schedule 10.03.2014
comment
Интересно, правда. Хотя эта информация может быть несколько полезной, я не уверен, что ее можно принять в качестве ответа, поскольку она не решает проблему. - person Kevin Worth; 10.03.2014
comment
Полный ответ добавлен выше. - person Kuffs; 10.03.2014
comment
Это потрясающе, вы определенно направили меня в правильном направлении. Я отредактировал ваш ответ (все еще жду экспертной оценки банкомата), изменив вторую половину вашего ответа. Используя способ sendBroadcast, ярлык добавляется в первое доступное место на центральном главном экране, а не туда, куда вы его поместили. - person Kevin Worth; 11.03.2014
comment
На самом деле я никогда не пробовал добавлять ярлык. Я полагал, что соответствующая часть получает возможность появляться на экране виджета. Это был интересный вопрос, и то, о чем я раньше не знал, возможно. Ваше редактирование было отклонено, поскольку оно изменило ответ, но я согласился с ним и поэтому сам изменил ответ соответствующим образом, поскольку в нем была дополнительная важная информация, относящаяся к задаче. - person Kuffs; 11.03.2014

Хм, хороший вопрос! Это правда, что виджеты, даже если они 1x1, не могут быть размещены внутри папки или дока.

Возможно, это действительно не виджет, который создается после выбора ярлыка/папки, а вместо этого создается ярлык. «Виджет» — это ярлык, и его можно поместить на рабочий стол с помощью «виджета» (выберите метку/папку).

С правильным разрешением и кодом вы можете создать ярлык из исходного кода.

person PieterAelse    schedule 10.03.2014
comment
Хотя вы были первыми и так близко, ответ Каффса дал реальный ключ к вопросу. - person Kevin Worth; 11.03.2014