【问题标题】:Android Manifest - "Has No Default Constructor" With Activity/Runnable ClassAndroid Manifest - 带有 Activity/Runnable 类的“没有默认构造函数”
【发布时间】:2014-09-19 00:19:48
【问题描述】:

我有一个相当混乱的问题。我正在尝试通过 Android 运行一个基本的聊天客户端。我已经在我的主要项目的 3 个类中设置了它。问题是,出于某种奇怪的原因,我的 ChatConnect.java(它处理实际的聊天消息)似乎没有作为 AndroidManifest.xml 的 Activity 弹出,这导致了一些严重的问题 - AKA 我需要使用布局(特别是game.xml)在我的 ChatConnect 类中,并且由于未在清单中定义为活动而拒绝加载。不管怎样,这是我的三门课。

是的,我意识到 StrictMode 非常糟糕。但是,即使在清单中有上述权限,我也无法让聊天客户端在没有它的情况下工作。我已经尝试清理我的项目。

非常感谢所有帮助!

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();
        }
    }
}

【问题讨论】:

  • 我不确定到底是什么问题......它“似乎没有作为 AndroidManifest.xml 的 Activity 弹出”?
  • 考虑到他们的名字,你的活动中很少有真正应该是活动的。活动用于用户界面。它们不是用于套接字、数据库或 SettingsHandler 的任何通用 Java 类。

标签: java android xml android-activity manifest


【解决方案1】:

Android Activity 类必须有一个不带参数的默认构造函数。你的ChatConnect 类有这个构造函数:

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

但系统正在寻找这样的:

public ChatConnect(){
}

但没有找到,这就是它崩溃的原因。

【讨论】:

    【解决方案2】:
    public ChatConnect(Socket s){
        socket = s;
    }
    

    删除此构造函数。 您的活动有构造函数。不要为活动定义构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 2022-01-01
      • 2023-03-20
      • 1970-01-01
      • 2021-09-19
      • 2016-07-18
      • 1970-01-01
      相关资源
      最近更新 更多