2014-09-19 21 views
10

Ho un problema abbastanza confuso. Sto cercando di eseguire un client di chat di base tramite Android. L'ho impostato in 3 classi del mio progetto principale. Il problema è, per qualche strana ragione, che il mio ChatConnect.java (che gestisce la chat effettiva) non sembra apparire come un'attività per AndroidManifest.xml, che sta causando alcuni seri problemi - AKA Devo usare un Layout (in particolare game.xml) nella mia classe ChatConnect e si rifiuta di caricarsi come risultato di non essere definita come un'attività nel manifest. Comunque, ecco le mie tre classi.Manifest Android: "Nessun costruttore predefinito" con attività/classe eseguibile

Sì, mi rendo conto che StrictMode è orribilmente terribile. Tuttavia, non riesco nemmeno a far funzionare il client di chat senza di esso, anche con le suddette autorizzazioni in manifest. Ho provato a pulire il mio progetto.

Tutto l'aiuto è molto apprezzato!

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

Non sono sicuro di quale sia il problema qui ... "non sembra comparire come attività per AndroidManifest.xml"? – drewhannay

+1

Dato il loro nome, alcune delle attività in realtà dovrebbero essere attività. Le attività sono per le interfacce utente. Non sono classi Java generiche utilizzate per socket o database, o qualunque sia il valore di "SettingsHandler". – CommonsWare

risposta

19

Android Activity classi devono avere un costruttore di default che non accetta parametri. La classe ChatConnect ha questo costruttore:

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

Ma il sistema è alla ricerca di uno come questo:

public ChatConnect(){ 
} 

e non trovare uno, ed è per questo che è schiantarsi.

Problemi correlati