2014-09-19 21 views
10

Oldukça kafa karıştırıcı bir sorunum var. Android ile temel bir sohbet istemcisi çalıştırmaya çalışıyorum. Ana projemdeki 3 sınıfta kurdum. Sorun, bazı garip nedenlerden dolayı, benim ChatConnect.java (hangi gerçek sohbet mesajlaşma işleyen) bazı ciddi sorunlara neden olan AndroidManifest.xml için bir Etkinlik olarak pop gibi görünmüyor - AKA bir Layout (özellikle game.xml) benim ChatConnect sınıfımda ve manifest içinde bir etkinlik olarak tanımlanmayan bir sonucu olarak yüklemeyi reddediyor. Her neyse, işte üç sınıfım.Android Manifest - "Varsayılan Oluşturucu Yok" Etkinliği/Çalışabilir Sınıfı Var

Evet, StrictMode'un korkunç derecede korkunç olduğunu anlıyorum. Bununla birlikte, sohbet istemcisinin, söz konusu izinlerde bile olsa, onsuz çalışmasını sağlayamıyorum. Projemi temizlemeyi denedim.

Tüm yardımlar büyük beğeni topluyor!

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

Sorunun tam olarak burada olduğundan emin değilim ... "AndroidManifest.xml için bir Etkinlik olarak görünmüyor gibi görünmüyor"? – drewhannay

+1

Onların isimleri göz önüne alındığında, aktivitelerinizden bazıları aslında aktiviteler olmalıdır. Faaliyetler kullanıcı arayüzleri içindir. Bunlar, yuvalar veya veritabanları için kullandığınız genel amaçlı Java sınıfları değil ya da 'SettingsHandler' işlevi ne olursa olsun. – CommonsWare

cevap

19

Android Activity sınıfları hiçbir parametre alır varsayılan bir yapıcı olması gerekir. Sizin ChatConnect sınıfı bu yapıcı vardır:

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

Ama sistem böyle biri arıyor:

public ChatConnect(){ 
} 

ve kilitlenme neden olanı, görmediklerine.

İlgili konular