2016-08-07 40 views
0

Ü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. **

+0

Können Sie auch eine Protokoll-/Stapelprotokollierung (oder zumindest die Zeilennummer, wo dies auftritt) posten? – EJoshuaS

+0

@EJoshuaS Der Fehler tritt bei dem gesamten Codeblock auf, beginnend mit: connectButton.Click + = (Objektabsender, EventArgs e) => –

Antwort

0

Rufen Sie in Ihrem Code SetContentView(Resource.Layout.main) kurz nach dem base.OnCreate(savedInstanceState).

Weitere Informationen finden Sie unter this similar question.

+0

Danke für die Antwort. Ich habe versucht, was Sie vorgeschlagen haben und den gleichen Fehler haben, diesmal wenn es um den NavigationItemSelected + = Code-Block geht. Es scheint, dass ich zwei verschiedene Inhaltsansichten einstellen muss. –