Qt C ++ не может вызвать функцию-член '~~ const' без объекта [duplicate]

Это старый вопрос, но он все еще активен, поскольку нет явной функции Android. И ребята из facebook нашли работу вокруг - как-то. Сегодня я нашел способ, который работает для меня. Не идеально (см. Примечания в конце этого ответа), но он работает!

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

Вот код. Он имеет кнопку increment. Когда вы нажимаете, ярлык заменяется на тот, у которого есть новый счетный номер.

Сначала вам нужны эти два разрешения в вашем манифесте:

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

Затем вам нужны эти два метода для установка и удаление ярлыков. Метод shortcutAdd создает растровое изображение с числом в нем. Это просто, чтобы продемонстрировать, что оно действительно меняется. Вероятно, вы захотите изменить эту часть с чем-то, чего хотите в своем приложении.

private void shortcutAdd(String name, int number) {
    // Intent to be send, when shortcut is pressed by user ("launched")
    Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
    shortcutIntent.setAction(Constants.ACTION_PLAY);

    // Create bitmap with number in it -> very default. You probably want to give it a more stylish look
    Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
    Paint paint = new Paint();
    paint.setColor(0xFF808080); // gray
    paint.setTextAlign(Paint.Align.CENTER);
    paint.setTextSize(50);
    new Canvas(bitmap).drawText(""+number, 50, 50, paint);
    ((ImageView) findViewById(R.id.icon)).setImageBitmap(bitmap);

    // Decorate the shortcut
    Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, bitmap);

    // Inform launcher to create shortcut
    addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(addIntent);
}

private void shortcutDel(String name) {
    // Intent to be send, when shortcut is pressed by user ("launched")
    Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
    shortcutIntent.setAction(Constants.ACTION_PLAY);

    // Decorate the shortcut
    Intent delIntent = new Intent();
    delIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    delIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);

    // Inform launcher to remove shortcut
    delIntent.setAction("com.android.launcher.action.UNINSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(delIntent);
}

И, наконец, вот два слушателя, чтобы добавить первый ярлык и обновить ярлык с помощью счетчика с добавлением.

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

    setContentView(R.layout.test);
    findViewById(R.id.add).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            shortcutAdd("changeIt!", count);
        }
    });
    findViewById(R.id.increment).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            shortcutDel("changeIt!");
            count++;
            shortcutAdd("changeIt!", count);
        }
    });
}

Замечания:

  • Этот способ также работает, если ваше приложение контролирует больше ярлыков на главном экране, например с различными дополнительными в Intent. Они просто нуждаются в разных именах, так что правый удаляется и переустанавливается.
  • Программная обработка ярлыков в Android - это хорошо известная, широко используемая, но не официально поддерживаемая функция Android. Кажется, что он работает с пусковой установкой по умолчанию, и я никогда не пробовал ее нигде. Так что не обвиняйте меня в том, что когда вы получаете это сообщение от пользователя «Это не работает на моем XYZ, двойном корневом, супер взорванном телефоне»
  • Лаунчер пишет Toast, когда ярлык был установлен, и один, когда ярлык был удален. Поэтому каждый раз, когда я меняю значок, я получаю два Toast s. Это не идеально, но хорошо, если остальное приложение отлично ...
28
задан Ziezi 18 September 2015 в 19:28
поделиться

3 ответа

Вам нужно создать экземпляр объекта, чтобы вызвать его функции-члены. Для функций-членов нужен объект для работы; их нельзя просто использовать самостоятельно. Функция main() может, например, выглядеть так:

int main()
{
   Name_pairs np;
   cout << "Enter names and ages. Use 0 to cancel.\n";
   while(np.test())
   {
      np.read_names();
      np.read_ages();
   }
   np.print();
   keep_window_open();
}
31
ответ дан Jason Plank 17 August 2018 в 09:13
поделиться

Вы правы - вы объявили новый тип использования (Name_pairs), и вам нужна переменная этого типа, чтобы использовать его.

Код должен выглядеть следующим образом:

Name_pairs np;
np.read_names()
2
ответ дан O'Neil 17 August 2018 в 09:13
поделиться

Если вы хотите вызвать их так, вы должны объявить их статическими.

21
ответ дан Rob K 17 August 2018 в 09:13
поделиться
  • 1
    В этом случае невозможно, так как для всех методов нужен контекст объекта для доступа к одному или нескольким именам объектов, возрастам, имени, возрасту. (они тоже могут быть статичными, но тогда это было бы совершенно бесполезно ;-)) – VolkerK 14 July 2009 в 21:28
  • 2
    Спасибо. правильный для моего дела. забыл поставить ключевое слово «статическое» – jondinham 23 August 2012 в 04:53
Другие вопросы по тегам:

Похожие вопросы: