c# - 在 MainActivity 中访问 MainPage.xaml 按钮

标签 c# android xaml xamarin xamarin.forms

这是我第一次接触 Xamarin Forms,所以我可能(而且很可能)以错误的方式做事。

我有以下 Xaml:

<ContentPage.Content>
    <StackLayout VerticalOptions="FillAndExpand"
                 HorizontalOptions="FillAndExpand"
                 Orientation="Vertical"
                 Spacing="15" x:Name="stackLayout">

        <Button x:Name="giveFeedback" Text="Start Recording" Clicked="OnStartRecording" />
        <Button x:Name="stopRecording" Text="Stop Recording" IsEnabled="false" Clicked="OnStopRecording" />

        <Label Text="Feedback:" />
        <Editor x:Name="feedbackTranscription" VerticalOptions="FillAndExpand" >
        </Editor>

        <Button x:Name="saveFeedback" IsEnabled="false"  Text="Save feedback" Clicked="OnSave" />

    </StackLayout>
</ContentPage.Content>

我想访问设备的麦克风以捕获音频。经过一番研究,我找到了适用于 Android 的 MediaRecorder 类。问题是我不知道如何从 MainActivity 类的 MainPage.xaml 访问元素。

主 Activity .cs

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        MediaRecorder _recorder;
        Button _start;
        Button _stop;

        string path = "/sdcard/test.3gpp";

        protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            //_start.Click += delegate {
            //    _stop.Enabled = !_stop.Enabled;
            //    _start.Enabled = !_start.Enabled;

            //    _recorder.SetAudioSource(AudioSource.Mic);
            //    _recorder.SetOutputFormat(OutputFormat.ThreeGpp);
            //    _recorder.SetAudioEncoder(AudioEncoder.AmrNb);
            //    _recorder.SetOutputFile(path);
            //    _recorder.Prepare();
            //    _recorder.Start();
            //};

            //_stop.Click += delegate {
            //    _stop.Enabled = !_stop.Enabled;

            //    _recorder.Stop();
            //    _recorder.Reset();
            //};

            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App());
        }

在这种情况下,我想将 giveFeedback 和 stopRecording 绑定(bind)到 MainActivity 类的 _start 和 _stop 按钮。我有一个 FindById<Button>(Resource.Id.start) 的例子.我应该为我的按钮设置 id 并做同样的事情吗?我应该使用 MVVM 吗?

PS:目前,我只想学习 Xamarin Forms with Android。

最佳答案

在PCL中创建这样的界面

    public interface PortableInterface
    {
        object GetLogicFromAndroidProject();
    }

像下面这样在你的android项目中添加扩展这个接口(interface)

using System;
using Xamarin.Forms;
[assembly: Dependency(typeof(PortableInterfaceRenderer))]
namespace YourProjectName.iOS
{

    public class PortableInterfaceRenderer : PortableInterface
    {
        public object GetLogicFromAndroidProject()
        {
            throw new NotImplementedException(); // here write your logic 
        }
    }
}

现在你必须在PCL项目中调用这个方法

var obj = DependencyService.Get<PortableInterface>().GetLogicFromAndroidProject();

希望对你有帮助

关于c# - 在 MainActivity 中访问 MainPage.xaml 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44670683/

相关文章:

c# - 如何将 WPF ComboBox 绑定(bind)到 XAML 中的 List<Objects>?

c# - 设置网格以填充整个屏幕

c# - 序列化名为 "return"的 JSON 对象

c# - 保存/加载 Unity3d

android - 避免使用多进程和应用程序 onCreate 崩溃

android - 如何在 android 上没有标题栏 AlertDialog? (尝试使用 requestWindowFeature 但没有解析符号)

c# - 在构建期间设置 web.config 属性(不是通过发布)

c# - Razor Pages Post 返回 400

java - 倒数计时器延迟 - Android

wpf - Visual Studio XAML 设计器错误 XDG0062 在 .NET Core WPF 应用程序中使用 EventSetter