访问MainActivity中的MainPage.xaml按钮

时间:2017-06-21 08:27:08

标签: 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中的元素。

MainActivity.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 MainActivity类的_start和_stop按钮的情况下。我有一个FindById<Button>(Resource.Id.start)的例子。我应该为我的按钮设置ID并执行相同的操作吗?我应该使用MVVM吗?

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

1 个答案:

答案 0 :(得分:1)

在PCL中创建这样的界面

    public interface PortableInterface
    {
        object GetLogicFromAndroidProject();
    }

在你的android项目中添加扩展此界面,如下所示

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();

希望这会有所帮助