访问 MainActivity 中的 MainPage.xaml 按钮



这是我第一次接触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 访问元素。

主要活动.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。

在 PCL 中创建这样的接口

public interface PortableInterface
{
object GetLogicFromAndroidProject();
}

在您的安卓项目中添加扩展此接口,如下所示

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

希望这会有所帮助

最新更新