【问题标题】:Passing string value from activity class to a non activity class将字符串值从活动类传递给非活动类
【发布时间】:2017-07-17 16:21:31
【问题描述】:

我是 android 的新手,我正在尝试将 TextView 中的字符串从 MainActivity 传递到没有活动的 Client.java 类。 我实际上是在尝试让它在 MainActivity 中进行:

    Intent i = new Intent(MainActivity.this, Client.class);
    i.putExtra("STRING_I_NEED", String.valueOf(indr));

在客户端:

Context context;
Intent intent = ((Activity) context).getIntent();
static Bundle getIp = getIntent.getExtra("STRING_I_NEED");
public static final Bundle SERVERIP = getIp; 

但那是说“

无法解析字符串中的符号“getIntent”
静态捆绑 getIp = getIntent.getExtra("STRING_I_NEED");

客户端代码:

public class Client {
private static String mIP= "";
private String serverMessage;
public static final String SERVERIP = mIP;
public static final int SERVERPORT = 4444;
private OnMessageReceived mMessageListener = null;
private boolean mRun = false;

PrintWriter out;
BufferedReader in;


public void setIp(String _IP) {
    mIP = _IP;
}
public Client(OnMessageReceived listener) {
    mMessageListener = listener;
}


public void sendMessage(String message){
    if (out != null && !out.checkError()) {
        out.println(message);
        out.flush();
    }
}

public void stopClient(){
    mRun = false;
}

public void run() {

    mRun = true;

    try {
        InetAddress serverAddr = InetAddress.getByName(String.valueOf(SERVERIP));

        Log.e("TCP Client", "C: Connecting...");

        Socket socket = new Socket(serverAddr, SERVERPORT);

        try {

            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

            Log.e("TCP Client", "C: Sent.");

            Log.e("TCP Client", "C: Done.");

            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            while (mRun) {
                serverMessage = in.readLine();

                if (serverMessage != null && mMessageListener != null) {
                    mMessageListener.messageReceived(serverMessage);
                }
                serverMessage = null;

            }

            Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'");

        } catch (Exception e) {

            Log.e("TCP", "S: Error", e);

        } finally {

            socket.close();
        }

    } catch (Exception e) {

        Log.e("TCP", "C: Error", e);

    }

}


public interface OnMessageReceived {
    void messageReceived(String message);
}
}

这里是 MainActivity :

public class MainActivity extends AppCompatActivity {
Server server;
Client client;
public static String message,ippi;
public static TextView terminale,indr,msg;
TextView log;
DataBaseHandler myDB;
allert Allert;
SharedPreferences prefs;
String s1 = "GAB Tamagnini SRL © 2017 \n" +
            "Via Beniamino Disraeli, 17,\n" +
            "42124 Reggio Emilia \n" +
            "Telefono: 0522 / 38 32 22 \n" +
            "Fax: 0522 / 38 32 72 \n" +
            "Partita IVA, Codice Fiscale \n" +
            "Reg. Impr. di RE 00168780351 \n" +
            "Cap. soc. € 50.000,00 i.v. \n" +  "" +
            "REA n. RE-107440 \n" +
            "presso C.C.I.A.A. di Reggio Emilia";
ImageButton settings,helps,allerts,home;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Utils.darkenStatusBar(this, R.color.colorAccent);
    server = new Server(this);
    myDB = DataBaseHandler.getInstance(this);
    new connectTask().execute("");

    msg = (TextView) findViewById(R.id.msg);
    log = (TextView) findViewById(R.id.log_avviso);
    settings = (ImageButton) findViewById(R.id.impo);
    helps = (ImageButton) findViewById(R.id.aiut);
    allerts = (ImageButton) findViewById(R.id.msge);
    home = (ImageButton) findViewById(R.id.gab);
    terminale = (TextView) findViewById(R.id.terminal);
    indr = (TextView) findViewById(R.id.indr);

    Cursor cursor = myDB.fetchData();
    if(cursor.moveToFirst()){
        do {
            indr.setText(cursor.getString(1));
            terminale.setText(cursor.getString(2));
        }while(cursor.moveToNext());
    }


    client.setIp(indr.getText().toString());


    cursor.close();
    server.Parti();



    message = indr.getText().toString();

    if (client != null) {
        client.sendMessage(message);
    }

    home.setOnClickListener(new View.OnClickListener() {

                                @Override
                                public void onClick(View view) {
                                    Toast.makeText(MainActivity.this,Client.SERVERIP, Toast.LENGTH_LONG).show();
                                }
                            });

    settings.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent impostazioni = new Intent(getApplicationContext(), settingsLogin.class);
            startActivity(impostazioni);
        }
    });

    helps.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent pgHelp = new Intent(getApplicationContext(), help.class);
            startActivity(pgHelp);
        }
    });

    allerts.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Server.count = 0;
            SharedPreferences prefs = getSharedPreferences("MY_DATA", MODE_PRIVATE);
            SharedPreferences.Editor editor = prefs.edit();
            editor.clear();
            editor.apply();
            msg.setVisibility(View.INVISIBLE);
            Intent pgAlert = new Intent(getApplicationContext(), allert.class);
            startActivity(pgAlert);
        }
    });

}

public class connectTask extends AsyncTask<String,String,Client> {

    @Override
    protected Client doInBackground(String... message) {

        //we create a TCPClient object and
        client = new Client(new Client.OnMessageReceived() {
            @Override
            //here the messageReceived method is implemented
            public void messageReceived(String message) {
                //this method calls the onProgressUpdate
                publishProgress(message);
            }
        });
        client.run();

        return null;
    }

}
@Override
protected void onDestroy() {

    super.onDestroy();
    server.onDestroy();
}

}

【问题讨论】:

  • 为什么不使用一种方法呢?
  • 什么是Client.java ??
  • 试试这个 Intent intent = ((Activity) context).getIntent();静态捆绑 getIp = intent.getExtra("STRING_I_NEED");
  • @IntelliJAmiya 这是一个 TCP 客户端类。
  • @hareeshJ 如果我这样做 getExtra 说“无法解析方法“getExtra(java.lang.String)”

标签: java android string android-activity


【解决方案1】:

问题:

由于Client.java(根据您的说法)不是活动类型类,因此您不能使用Intent 调用/调用Client.javaIntent 仅用于调用:ActivitiesBroadcastReceiverServices

您的 Client.java 没有扩展 Activity、Broadcast 或 Service。这就是为什么您没有 getIntent() 函数,甚至没有函数 onCreate()onReceive(),onStartCommand()oronHandleIntent()'` 的原因。


正确方法:

1. 所以你要做的就是像任何其他对象一样创建该类的对象并调用它的setter。您可以在您的类中定义一个公共方法来设置 IP 的值:

YourClass {
   private String mIP;

   public void setIp(String _IP) {
       mIp = _IP;
    }
}

并且在 MainActivity 类中,您可以在对象初始化后调用该方法:

MyClassObject.setIp("127.0.0.1");

2.定义一个重载的构造函数,并使用它设置值。

3.MainActivity 中创建一个public static String IP,为其赋值,然后在您的类中执行此操作以检索该值:

YourClass {
       private String mIP;

       public void getIp() {
           mIP = MainActivity.IP;
        }
    }

【讨论】:

  • 实际上我在 Main 中这样做了:client.setIp(indr.getText().toString());因为我必须在 mIP 中设置来自 TextView 的文本,而不是手动设置,但是当我尝试将其可视化时,它仍然会导致 null
  • 请编辑您的问题并发布相关代码,以便我可以看到问题出在哪里,您是否试图通过用户输入从 EditText 获取价值(这与 TextView 不同) ??
  • 实际上我在 settings.java 类的 EditText 中设置文本,但我在数据库中传递该值并在我在 TextView 中设置此文本后在 MainActivity 中检索它,我试图通过此文本在 Client.java 非活动类的字符串中,现在将发布 MainActivity 和客户端代码等待一段时间。
  • 我认为客户端在你调用它时没有初始化 client.setIp(indr.getText().toString());因为你是在一个单独的线程中做的异步任务
  • 当生病有 15 个代表时,我会做 upwote :)
【解决方案2】:

在您的客户端类中。

public void setString(String yourString){
    variableToStoreStringInClass = yourString;
}

在您的 MainActivity 中,您希望将字符串发送到客户端。

Client yourClient = new Client();
yourClient.setString("Enter the string");

或者你可以使用静态方法:

在客户端类中:

public static void setString(String yourString){
    variableToStoreStringInClass = yourString;
}

在你的 MainActivity 中

Client.setString("Enter the string");

【讨论】:

  • 我正在尝试执行此操作,但如何在 Client.setString() 中设置 TextView 中的文本?我正在尝试做 client.setIp(indr.getText().toString());但是当我在 Toast 中将其可视化时,结果为 null
  • 你在哪里展示 Toast?你在哪里做indr.getText.toString
  • 点击时我在 MainActivity 中显示 Toast,同时在 OnCreate 中执行 indr.getText.ToString。
  • 但实际上我不需要那个 Toast 我只是为了测试我是否通过了那个字符串。
  • 在 Oncreate 中,我认为 TextView 中仍然没有文本,因此当您分配 ip 时,您正在分配一个空字符串,并将其传递给您的 Client 类。尝试在 onClick 中做 setIp
【解决方案3】:

在您的设置活动中,当您在该 TextView 中设置字符串时,还将其保存在共享首选项中,如下所示:

SharedPreferences prefs = this.getSharedPreferences(
      "com.example.app", Context.MODE_PRIVATE);

prefs.edit().putString("IP", IP_String).apply();

然后在主要活动中:

SharedPreferences prefs = this.getSharedPreferences(
      "com.example.app", Context.MODE_PRIVATE);

String ip = prefs.getString("IP", "AnyDefaultValue");

client.setIp(ip);

【讨论】:

    【解决方案4】:

    在 MainActivity 中初始化静态字符串并将 textView 文本分配给该字符串。

    在 Client.java 中这样调用 MainActivity.IntializedString

    【讨论】:

    • 如果我在尝试检查数据是否已通过吐司传递时像这样传递它,吐司说它是空的。
    【解决方案5】:

    试试下面的示例

    public class Client {
        Context context;
        Intent intent;
        String value = "";
    
        public Client(Activity activity) {
            context = activity;
            intent = ((Activity) context).getIntent();
            value = intent.getStringExtra("String_i_need");
        }
    }
    

    【讨论】:

    • 实际上我在 Client.java 中设置了另一个字符串作为 SERVERIP = value;但是当我试图在 MainActivity 中的 Toast 中将其可视化时,结果为空
    猜你喜欢
    • 1970-01-01
    • 2015-10-16
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多