Какой пакет следует использовать в формах Xamarin вместо Android .Content для получения класса Intent? - PullRequest
3 голосов
/ 08 января 2020

TL; DR:

Нужно использовать класс Intent для разных вещей. В Интернете можно найти примеры, где используется using Android.Content. Это не относится к Xamarin.Forms (я думаю). Какой пакет NuGet необходим для его работы?

Нет ... У меня есть время:

Введение (ненужное чтение)

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

Мое приложение в основном WebView контейнер с некоторыми другими незначительными функциями. Я использую Visual Studio 2019 и Xamarin.Forms , но на данный момент я компилирую только Android. iOS и UWP - однажды моя цель, по крайней мере одно приложение полностью завершено для Android.

Проблема 1 и где Я

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

Я понял, как добавить еще один элемент в меню, но в настоящее время я связываю этот элемент списка с market://details?id=com.mycompany.myapp URL моего приложения на PlayStore . Он прекрасно открывается в PlayStore , но после нажатия кнопки «Назад» он переходит на домашний экран, а не обратно в приложение.

Текущий код, в который я добавил «Оценить нас»

MainPage.xaml.cs

using MyApp.Models;
using Plugin.Geolocator;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xamarin.Forms;

namespace MyApp.Views {
    ...
    public partial class MainPage : MasterDetailPage {
        ...
        public async Task NavigateFromMenu(int id) {
            if (!MenuPages.ContainsKey(id) {
                switch(id) {
                    ...
                    case (int)MenuItemType.RateUs:
                        await Browser.OpenAsync("market://details?id=com.mycompany.myapp", BrowserLaunchMode.SystemPreferred);
                        // startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.mycompany.myapp")));
                        break;
                    ...
                }
            }
            ...
        }
    }
}

MenuPage.xaml.cs

using MyApp.Models;
using System.Collections.Generic;
using System.ComponentModel;
using Xamarin.Forms;

namespace MyApp.Views {
    ...
    public partial class MenuPage : ContentPage {
        ...
        public MenuPage() {
            InitializeComponent();
            menuItems = new List<HomeMenuItem> {
                ...
                new HomeMenuItem { id = MenuItemType.RateUs, Title="Rate Us", Icon="\uf005" },
                ...
            }
        }
    }
}

HomeMenuItem.cs

namespace MyApp.Models {
    public enum MenuItemType {
        ...
        RateUs,
        ...
    }
    public class HomeMenuItem {
        public MenuItemType Id { get; set; }
        public string Title { get; set; }
        public string Icon { get; set; }
    }
}

Что я пробовал

Как вы можете видеть в комментарии // в MainPage.xaml.cs, я нашел другое решение, которое, возможно, вернуло бы меня обратно в мое приложение после возврата из PlayStore .

Этот конкретный решение (очевидно ???) проблематично c в startActivity, подсказка с указанием

Название 'startActivity' не существует в текущем контексте

, но Есть и другие, гораздо более сложные решения, такие как ЭТО ОДИН , в которых startActivity обернуты public void function(), что, я думаю, помогает.

Проблема 2

Мне нужно добавьте еще один элемент списка в боковое меню под названием « Share », где устройство спросит, с каким приложением вы хотите поделиться (или со py в буфер обмена), а затем использовать это приложение, чтобы поделиться текстом и ссылкой на мой выбор (то же самое для всех пользователей). Опять же, любая LINK , которую я нахожу, использует Intent.

При полной потере здесь. Если вы не можете дать мне инструменты и руководство по их использованию, по крайней мере, укажите мне правильное направление, пожалуйста.

1 Ответ

1 голос
/ 08 января 2020

Существует несколько способов вызова класса Intent в вашем приложении, один из них, и, возможно, лучшим будет использование DependencyService.

Из document:

Класс DependencyService - это локатор служб, который позволяет приложениям Xamarin.Forms вызывать функциональные возможности собственной платформы из общего кода.

Небольшой пример для вашего варианта использования

Как видно из документа, первое, что вам нужно сделать, - это создать Интерфейс , чтобы определить метод, который вы хотите реализовать. В нашем случае я создам простой интерфейс, который определяет один метод с именем LaunchAppInPlayStore (это можно вызывать как угодно!):

namespace App2
{
    public interface Interface1
    {
        void LaunchAppOnPlayStore();
    }
}

Позволяет go включить и реализовать это в Android проект: для этого я добавляю в него класс с именем MyInterfaceImplementationAndroid и делаю наследование от Interface1. Затем я реализую метод из интерфейса следующим образом:

using Xamarin.Forms;
using Android.Content;
using Plugin.CurrentActivity;

[assembly: Dependency(typeof(App2.Droid.MyInterfaceImplementationAndroid))]

namespace App2.Droid
{
    class MyInterfaceImplementationAndroid : Interface1
    {
        public void LaunchAppOnPlayStore()
        {
            CrossCurrentActivity.Current.AppContext.StartActivity(new Intent(Intent.ActionView, Android.Net.Uri.Parse("market://details?id=com.mycompany.myapp")));
        }
    }
}

Следует отметить, что в моем примере я использую Context, предоставляемый плагином CurrentActivity : @JamesMontemagno (это просто косвенно, и в моих собственных приложениях я сам использую другой подход, как я описал в еще одном SO Post (см. Часть, где я добавляю класс MainApplication, чтобы получить Current Context или посмотрите сообщение в блоге @DavidBritch (стоит прочитать!)))

Мы почти закончили! Теперь вам просто нужно вызвать метод в вашем общем коде следующим образом: Ради этого примера я создал простую страницу с кнопкой:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="App2.TestInyection">
    <ContentPage.Content>
        <StackLayout>
            <Button Text="Go to shop!"
                    Clicked="Button_Clicked"
                VerticalOptions="CenterAndExpand" 
                HorizontalOptions="CenterAndExpand" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

, а в коде позади я просто вызываю LaunchAppOnPlayStore метод следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace App2
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class TestInyection : ContentPage
    {
        public TestInyection()
        {
            InitializeComponent();
        }

        private void Button_Clicked(object sender, EventArgs e)
        {
            DependencyService.Get<Interface1>().LaunchAppOnPlayStore();
        }
    }
}
...