ÜBERBLICK ein Stück Code zu binden:Wie eine Schaltfläche klicken Ereignis Xamarin Android
Ich brauche eine App erstellen einen einfachen String über TCP an einen Server auf einem PC zu senden. Ich schreibe diese App in Visual Studio 2015 mit Xamarin. Früher hatte ich den TCP-Versand zum Funktionieren gebracht, aber ich wollte, dass die App besser aussieht. Ich habe eine Vorlage heruntergeladen und bin zur Arbeit gegangen, um den Code wieder hinzuzufügen. Ich stieß jedoch auf ein Problem, als ich versuchte, das Programm auszuführen. Es hat mir Object nicht auf Instanzfehler gesetzt.
Im Grunde genommen bin ich ein Newb und habe keine Ahnung, wo ich den Code einstellen soll, der ausgeführt wird, wenn eine Taste gedrückt wird. Jede Hilfe ist willkommen, und bedenken Sie bitte, dass ich ein ziemlich frustriert (Ich entschuldige mich tun) und ich werde freundlich handeln, wenn das gleiche für mich bezahlt wird :)
Danke an alle, hier ist der Code:
using Android.App;
using Android.Content.PM;
using Android.Content.Res;
using Android.OS;
using Android.Support.V4.Widget;
using Android.Views;
using Android.Widget;
using AndroidApp1.Fragments;
using Android.Support.V7.App;
using Android.Support.V4.View;
using Android.Support.Design.Widget;
using System.IO;
using System;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Net.Sockets;
namespace AndroidApp1.Activities
{
[Activity(Label = "Home", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, Icon = "@drawable/Icon")]
public class MainActivity : BaseActivity
{
TcpClient client; // Creates a TCP Client
NetworkStream stream; //Creats a NetworkStream (used for sending and receiving data)
byte[] datalength = new byte[4]; // creates a new byte with length 4 (used for receivng data's lenght)
DrawerLayout drawerLayout;
NavigationView navigationView;
protected override int LayoutResource
{
get
{
return Resource.Layout.main;
}
}
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
drawerLayout = this.FindViewById<DrawerLayout>(Resource.Id.drawer_layout);
//Set hamburger items menu
SupportActionBar.SetHomeAsUpIndicator(Resource.Drawable.ic_menu);
//setup navigation view
navigationView = FindViewById<NavigationView>(Resource.Id.nav_view);
Button connectButton = FindViewById<Button>(Resource.Id.buttonConnect);
//handle navigation
navigationView.NavigationItemSelected += (sender, e) =>
{
e.MenuItem.SetChecked(true);
switch (e.MenuItem.ItemId)
{
case Resource.Id.nav_home_1:
ListItemClicked(0);
break;
case Resource.Id.nav_home_2:
ListItemClicked(1);
break;
}
Snackbar.Make(drawerLayout, "You selected: " + e.MenuItem.TitleFormatted, Snackbar.LengthLong)
.Show();
drawerLayout.CloseDrawers();
};
SetContentView(Resource.Layout.main);
//if first time you will want to go ahead and click first item.
if (savedInstanceState == null)
{
ListItemClicked(0);
}
connectButton.Click += (object sender, EventArgs e) =>
{
try
{
if (FindViewById<Button>(Resource.Id.buttonConnect).Text == "Connect")
{
client = new TcpClient("10.0.0.85", 21); //Trys to Connect
Toast.MakeText(this, "Connected", ToastLength.Short).Show();
// buttonConnect.Text = "Dis-Connect";
// textReceive.Text = null;
// buttonSend.Enabled = true;
}
else
{
// buttonConnect.Text = "Connect";
Toast.MakeText(this, "Dis-Connected", ToastLength.Short).Show();
client.GetStream().Close();
client.Close();
}
}
catch (Exception ex)
{
Toast.MakeText(this, ex.Message, ToastLength.Short).Show();
}
};
}
int oldPosition = -1;
private void ListItemClicked(int position)
{
//this way we don't load twice, but you might want to modify this a bit.
if (position == oldPosition)
return;
oldPosition = position;
Android.Support.V4.App.Fragment fragment = null;
switch (position)
{
case 0:
fragment = Fragment1.NewInstance();
break;
case 1:
fragment = Fragment2.NewInstance();
break;
}
SupportFragmentManager.BeginTransaction()
.Replace(Resource.Id.content_frame, fragment)
.Commit();
}
public override bool OnOptionsItemSelected(IMenuItem item)
{
switch (item.ItemId)
{
case Android.Resource.Id.Home:
drawerLayout.OpenDrawer(Android.Support.V4.View.GravityCompat.Start);
return true;
}
return base.OnOptionsItemSelected(item);
}
public void clientSend(string msg)
{
try
{
stream = client.GetStream(); //Gets The Stream of The Connection
byte[] data; // creates a new byte without mentioning the size of it cuz its a byte used for sending
data = Encoding.Default.GetBytes(msg); // put the msg in the byte (it automaticly uses the size of the msg)
int length = data.Length; // Gets the length of the byte data
byte[] datalength = new byte[4]; // Creates a new byte with length of 4
datalength = BitConverter.GetBytes(length); //put the length in a byte to send it
stream.Write(datalength, 0, 4); // sends the data's length
stream.Write(data, 0, data.Length); //Sends the real data
}
catch (Exception ex)
{
Toast.MakeText(this, ex.Message, ToastLength.Short).Show();
}
}
}
}
hier ist der Code-Design:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:p1="http://schemas.android.com/apk/res/android"
p1:layout_width="match_parent"
p1:layout_height="match_parent"
p1:id="@+id/gridLayout1">
<TextView
p1:text="Home Team"
p1:textAppearance="?android:attr/textAppearanceMedium"
p1:id="@+id/textView1"
p1:layout_marginLeft="21.0dp" />
<Button
p1:text="+"
p1:id="@+id/buttonHomeScoreAdd"
p1:layout_marginRight="43.5dp"
p1:layout_marginLeft="-100dp"
p1:layout_marginTop="55.5dp"
p1:layout_marginBottom="12.0dp" />
<Button
p1:text="-"
p1:id="@+id/buttonHomeScoreMinus"
p1:layout_marginRight="43.5dp"
p1:layout_marginLeft="0.0dp"
p1:layout_marginTop="55.5dp"
p1:layout_marginBottom="12.0dp" />
<Button
p1:text="Connect"
p1:id="@+id/buttonConnect"
p1:layout_marginTop="481.5dp"
p1:layout_width="300dp"
p1:layout_marginRight="0dp"
p1:layout_marginLeft="-250dp" />
</GridLayout>
** um zu klären, ich möchte wissen, wo Sie den Code setzen, die ein Objekt auf eine Schaltfläche Ereignis binden wird (foo + = foo). Es scheint, dass die Ansicht nicht rechtzeitig geladen wird, um an ihrem aktuellen Ort richtig zu funktionieren. **
Können Sie auch eine Protokoll-/Stapelprotokollierung (oder zumindest die Zeilennummer, wo dies auftritt) posten? – EJoshuaS
@EJoshuaS Der Fehler tritt bei dem gesamten Codeblock auf, beginnend mit: connectButton.Click + = (Objektabsender, EventArgs e) => –