2014-09-19 7 views
10

Ich habe ein ziemlich verwirrendes Problem. Ich versuche, einen einfachen Chat-Client über Android zu betreiben. Ich habe es in 3 Klassen meines Hauptprojekts eingerichtet. Das Problem ist, aus irgendeinem Grund, mein ChatConnect.java (die tatsächlichen Chat-Messaging behandelt) scheint nicht erscheinen als eine Aktivität für AndroidManifest.xml, die einige schwerwiegende Probleme verursacht - AKA muss ich ein Layout verwenden (speziell game.xml) in meiner ChatConnect-Klasse, und es lädt nicht, weil es nicht als Aktivität im Manifest definiert wurde. Wie auch immer, hier sind meine drei Klassen.Android-Manifest - "Hat keinen Standardkonstruktor" mit Aktivität/lauffähige Klasse

Ja, mir ist klar, StrictMode ist schrecklich schrecklich. Allerdings kann ich den Chat-Client auch ohne diese Berechtigungen in Manifest nicht ausführen. Ich habe versucht, mein Projekt zu säubern.

Alle Hilfe wird sehr geschätzt!

ChatConnect.java

package com.example.AndroidRPGNew.multiplayer; 

import android.app.Activity; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import com.example.AndroidRPGNew.Main; 
import com.example.AndroidRPGNew.R; 

import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.Scanner; 

public class ChatConnect extends Activity implements Runnable { 
    // Begin displaying messages to game.xml. Display to chatView via new lines. 
    // Ability to send message via chatMessageSend - Sends chat message data from chatMessage  text field 
    // Once connected, log to chat. Allow for multicolors, etc. 
    private Socket socket; 
    public String userId; 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.game); 
     SharedPreferences settings = getSharedPreferences(Main.PREFS_NAME, 0); 
     userId = settings.getString("userId", "unknown"); 
     run(); 
    } 
    public ChatConnect(Socket s){ 
     socket = s; 
    } 
    public void run(){ 
     try{ 
      final Scanner chat = new Scanner(System.in); 
      final Scanner in = new Scanner(socket.getInputStream()); 
      final PrintWriter out = new PrintWriter(socket.getOutputStream()); 
      Button sendMessage = (Button) findViewById(R.id.chatMessageSend); // ERROR HERE: ALTHOUGH IT IS SUPPOSED TO BE IN GAME.XML CONTENT VIEW, THIS CAUSES A NULLPOINTER! 
      sendMessage.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        TextView input = (TextView) findViewById(R.id.chatMessage); 
        String inputMsg = input.toString(); 
        out.println(inputMsg); 
        out.flush(); 
        if(in.hasNext()){ 
         System.out.println(in.nextLine()); 
        } 
       } 
      }); 
      while(true){ 
       String input = chat.nextLine(); 
       out.println(input); 
       out.flush(); 
       if(in.hasNext()){ 
        System.out.println(in.nextLine()); 
       } 
      } 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.example.AndroidRPGNew" 
      android:versionCode="1" 
      android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="16"/> 
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"> 
     <activity android:name="com.example.AndroidRPGNew.Main" 
        android:label="@string/app_name" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
     <activity android:name="com.example.AndroidRPGNew.SettingsHandler" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"> 
     </activity> 
     <activity android:name="com.example.AndroidRPGNew.StoreHandler" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"> 
     </activity> 
     <activity android:name="com.example.AndroidRPGNew.Loading" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"> 
     </activity> 
     <activity android:name="com.example.AndroidRPGNew.MusicInitiator" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"> 
     </activity> 
     <activity android:name="com.example.AndroidRPGNew.multiplayer.AccountCreate" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"> 
     </activity> 
     <activity android:name="com.example.AndroidRPGNew.multiplayer.AccountSetup" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"> 
     </activity> 
     <activity android:name="com.example.AndroidRPGNew.multiplayer.MultiplayerMenu" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"> 
     </activity> 
     <activity android:name="com.example.AndroidRPGNew.multiplayer.SQLConnection" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"> 
     </activity> 
     <activity android:name="com.example.AndroidRPGNew.multiplayer.ServerConnect" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"> 
     </activity> 
     <activity android:name="com.example.AndroidRPGNew.multiplayer.ChatConnect" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"> 
     </activity> 
    </application> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.NETWORK" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 
</manifest> 

ServerConnect.java

package com.example.AndroidRPGNew.multiplayer; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.util.Log; 
import com.example.AndroidRPGNew.R; 

import java.net.Socket; 

/** 
* Created by fccardiff on 9/18/14. 
*/ 
public class ServerConnect extends Activity { 
    // Establish connection to server, with IP from MultiplayerMenu 
    // Initiate ChatConnect 
    String userId = null; 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     setContentView(R.layout.game); 
     // TODO: KEEP THE ABOVE TWO LINES ONLY TEMPORARILY - FIND A FIX! 
     connect(); 
    } 
    public void connect() { 
     final int port = 2525; 
     final String IP = MultiplayerMenu.getIP(); 
     try { 
      Socket s = new Socket(IP, port); 
      Log.w("Server:", "Connected to " + IP + ":" + port); 
      ChatConnect client = new ChatConnect(s); 
      Thread thread = new Thread(client); 
      thread.start(); 

     } catch (Exception serverNotFound) { 
      serverNotFound.printStackTrace(); 
     } 
    } 
} 
+0

Ich bin mir nicht sicher, was genau das Problem hier ist ... es "scheint nicht als Aktivität für AndroidManifest.xml angezeigt werden"? – drewhannay

+1

Angesichts ihrer Namen sollten einige Ihrer Aktivitäten eigentlich Aktivitäten sein. Aktivitäten sind für Benutzeroberflächen. Sie sind keine allgemeinen Java-Klassen, die Sie für Sockets oder Datenbanken verwenden, oder was auch immer ein 'SettingsHandler' ist. – CommonsWare

Antwort

19

Android Activity Klassen müssen über einen Standardkonstruktor verfügen, die keine Parameter annimmt. Ihre ChatConnect Klasse hat diesen Konstruktor:

public ChatConnect(Socket s){ 
     socket = s; 
} 

Aber das System sucht man wie folgt aus:

public ChatConnect(){ 
} 

und nicht einen zu finden, weshalb es abstürzt.