【问题标题】:xamarin(Android) view equivalent to windows forms panelxamarin(Android) 视图等效于 windows 窗体面板
【发布时间】:2017-11-01 07:13:42
【问题描述】:

我正在尝试创建一个应用程序,用户在该应用程序中单击屏幕上的某个位置,然后将在单击时创建一个文本字段。 如果我要制作一个 Windows 窗体应用程序,我会使用面板控件,但我很难在 Xamarin Android 中找到类似的东西。 请记住,我使用的是滚动视图。 是否有适用于 Android 的 xamarin 视图与 Windows 窗体面板的工作方式类似,或者也可以完成工作? 提前致谢!

【问题讨论】:

  • 好吧,基本上在 Android/Java 中任何 View 都可以,只要你能捕捉到用户手势“点击”或“触摸”并提取相关位置。例如,将RelativeLayout,在Relativelayout 中设置clickable = true,然后瞧!我会检查 Xamarin 的特性并稍后发布一些代码。
  • 谢谢。我会尝试使用布局。
  • 效果很好!谢谢你的建议。
  • yw :) 你能用一些社区代码回答你的问题吗?没有时间挖掘我的视觉工作室......
  • 我添加了一个答案。

标签: c# android xamarin xamarin.android


【解决方案1】:

这是我解决它的方法。正如 W00ly 所建议的,我使用 RelativeLayout 作为可点击视图。 RelativeLayout 的优点在于您可以在绝对位置向其添加视图,而仅使用视图无法做到这一点。 我从修改 Main.axml 布局文件开始:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <include
        android:id="@+id/toolbar"
        layout="@layout/mainToolBar" />
    <include
        android:id="@+id/overflow"
        layout="@layout/overflowToolBar" />
    <ScrollView
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/toolbar"
        android:id="@+id/svwMain">
        <RelativeLayout
            android:minWidth="25px"
            android:minHeight="25px"
            android:layout_width="match_parent"
            android:layout_height="3000px"
            android:id="@+id/relMain"
            android:clickable="true" />
    </ScrollView>
</RelativeLayout>

请忽略工具栏。 clickable 属性非常重要。 为了在 Android 语言中跟踪点击次数,您需要做三件事。 在 mainActivity 文件中,我放置了对 RelativeLayout 的引用并调用 它的 SetOnTouchListener() 方法。

relMain = FindViewById<RelativeLayout>(Resource.Id.relMain);
relMain.SetOnTouchListener(this);

为此,您的 mainActivity 必须从 View.IOnTouchListener 派生并扩展:

public class MainActivity : Activity, View.IOnTouchListener 

最后,您需要添加 OnTouch() 方法来跟踪调用了 SetOnTouchListener() 方法的任何视图的点击:

public bool OnTouch(View v, MotionEvent e)
{
    bool doubleClick = false;
    switch (e.Action)
    {
        case MotionEventActions.Down:
            saveClickPosition[0] = clickPosition[0];
            saveClickPosition[1] = clickPosition[1];
            clickPosition[0] = e.GetX();
            clickPosition[1] = e.GetY();
            doubleClick = toggleClick(clickPosition[0], clickPosition[1], saveClickPosition[0], saveClickPosition[1]);
            break;
    }
    if (v.GetType() == typeof(TextView) && doubleClick)
    {
        relMain.RemoveView(v);
        return true;
    }
    switch (v.Id)
    {
        case Resource.Id.relMain:
            if (doubleClick)
            {
                relParams = new RelativeLayout.LayoutParams(300, 140);
                relParams.LeftMargin = (int)clickPosition[0];
                relParams.TopMargin = (int)clickPosition[1];
                var tvwTest = new TextView(relMain.Context);
                tvwTest.Text = string.Format("x: {0} y: {1}", clickPosition[0], clickPosition[1]);
                tvwTest.SetOnTouchListener(this);
                relMain.AddView(tvwTest, relParams);
            }                 
            break;
    }
    return true;
}

我的 OnTouch() 方法所做的远远超出了完成我的应用程序需要做的事情。我仍然在这里留下完整的方法,因为我做的一些事情可能对其他人有帮助。 请记住,我的方法很混乱。我仍在使用它进行测试。 这是一个简短的视频,显示所有工作: Video

【讨论】:

  • 太好了 :) 谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-10-03
  • 2018-09-15
  • 2019-06-17
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
相关资源
最近更新 更多