Android - 从其他 activity 更改文本视图
Android - changing textview from other activity
我对编程还很陌生。
我正在尝试制作一个包含两个活动的简单应用,其中第二个 activity 可以更改第一个的文本。我知道可以使用 intents 来完成,但我想知道是否有更直接的方法,例如使用第二个 activity 从第一个 activity 调用函数?
这是我目前的代码:
MainActivity,其中包含一个 TextView 和一个用于打开第二个的按钮 activity:
public class MainActivity extends Activity {
TextView textview;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.et2);
button = (Button) findViewById(R.id.b1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this, ChangeText.class);
startActivity(intent);
}
});
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
}
public void changetext(String message) {
textview.setText(message);
}
}
第二个 activity,ChangeText,它包含一个 EditText 和一个按钮,该按钮应更改 MainActivity 中 TextView 的文本,然后自行完成:
public class ChangeText extends Activity{
EditText edittext;
Button button;
private MainActivity mainclass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.change_text);
edittext = (EditText)findViewById(R.id.et2);
button = (Button)findViewById(R.id.b2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String message = edittext.getText().toString();
mainclass.changetext(message);
finish();
}
});
}
}
如您所见,我试图通过在 MainActivity 中创建一个 public 函数来使该应用程序工作,该函数接收一个字符串并用它设置 TextView,然后我从 ChangeText activity.
问题:一直崩溃!谁能告诉我如何才能完成这项工作?
似乎我大约一周前回答了几乎完全相同的问题,所以这可能是重复的,但我似乎找不到原始问题。
简短的回答是否定的 - 您不能从另一个 Activity 调用 Activity 中的方法。问题是为了正常的编程目的,一次只存在一个 Activity*。
如果您采取一些措施来规避这一点,那么您就有可能导致一些重大问题,包括高内存使用率、空指针异常等。
正确的做法确实是通过 Intent 系统。
*
Activity 在变为非活动状态时可能会或可能不会实际被销毁,这取决于诸如您如何使用后退堆栈等因素。
但是,如果它们在不活动时确实被销毁,您应该始终编程 - 阅读、理解并尊重 Activity 生命周期。
对于像您的应用程序这样简单的东西,"most direct" 方法是使用 intent 和 startActivityForResult 并在您的主 [=19] 中实现 onActivityResult =].
您将 运行 遇到的问题是,即使您正确地传递给您 Activity 引用,也不能保证它们同时 运行ning。
除了 Intents 之外的其他方式,是使用不涉及 Activity 的 class(s)。扩展应用程序的 class 中的后台服务或静态变量。我很少使用应用程序 classes 来支持服务和绑定活动。
如果我在项目中使用 EventBus,它们可以发送 Sticky 事件,这些事件将保留数据直到被清除。
Android 使用消息传递机制在其组件之间进行通信。此消息传递机制对 Android 至关重要,因此您应该使用它。正如您已经说过的,消息传递是由 Intents 实现的。 ;-)
如果您想要更复杂的东西,请使用 EventBus 或实现您自己的 subscribe/publish 机制来满足您的需求。
使用静态变量
示例
在您的 MainActivity 中定义
public static String msg = null;
然后在您的 ChangeText 中 activity 将更改后的文本分配给它,例如
MainActivity.msg = edittext.getText().toString();
现在在您的主要 activity 重写 onResume() 方法
if(msg != null){
textview.setText(msg);
msg = null;
}
您必须使用 LocalBroadCast Manager 才能这样做
这是 MainActivity,其中包含必须由另一个 Activity
更新的 TextView
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt=(TextView)findViewById(R.id.txt1);
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
new IntentFilter("custom-event-name"));
}
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String s1= intent.getStringExtra("myString");
getIt(s1);
}
};
@Override
protected void onDestroy() {
// Unregister since the activity is about to be closed.
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
public void getIt(String s)
{
System.out.println(s);
txt.setText(s);
}
public void go(View view)
{
Intent intent = new Intent(this,WriteText.class);
startActivity(intent);
}
}
这是 Activity,其中包含更新前一个 activity
中的 TextView 的 EditText
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
public class WriteText extends Activity {
EditText ed1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_write_text);
ed1 = (EditText)findViewById(R.id.textView);
}
public void come(View view){
Intent intent = new Intent("custom-event-name");
intent.putExtra("myString", ed1.getText().toString());
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
这对我有用,希望对你也有用
我对编程还很陌生。
我正在尝试制作一个包含两个活动的简单应用,其中第二个 activity 可以更改第一个的文本。我知道可以使用 intents 来完成,但我想知道是否有更直接的方法,例如使用第二个 activity 从第一个 activity 调用函数?
这是我目前的代码:
MainActivity,其中包含一个 TextView 和一个用于打开第二个的按钮 activity:
public class MainActivity extends Activity {
TextView textview;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.et2);
button = (Button) findViewById(R.id.b1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this, ChangeText.class);
startActivity(intent);
}
});
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
}
public void changetext(String message) {
textview.setText(message);
}
}
第二个 activity,ChangeText,它包含一个 EditText 和一个按钮,该按钮应更改 MainActivity 中 TextView 的文本,然后自行完成:
public class ChangeText extends Activity{
EditText edittext;
Button button;
private MainActivity mainclass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.change_text);
edittext = (EditText)findViewById(R.id.et2);
button = (Button)findViewById(R.id.b2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String message = edittext.getText().toString();
mainclass.changetext(message);
finish();
}
});
}
}
如您所见,我试图通过在 MainActivity 中创建一个 public 函数来使该应用程序工作,该函数接收一个字符串并用它设置 TextView,然后我从 ChangeText activity.
问题:一直崩溃!谁能告诉我如何才能完成这项工作?
似乎我大约一周前回答了几乎完全相同的问题,所以这可能是重复的,但我似乎找不到原始问题。
简短的回答是否定的 - 您不能从另一个 Activity 调用 Activity 中的方法。问题是为了正常的编程目的,一次只存在一个 Activity*。
如果您采取一些措施来规避这一点,那么您就有可能导致一些重大问题,包括高内存使用率、空指针异常等。
正确的做法确实是通过 Intent 系统。
*
Activity 在变为非活动状态时可能会或可能不会实际被销毁,这取决于诸如您如何使用后退堆栈等因素。
但是,如果它们在不活动时确实被销毁,您应该始终编程 - 阅读、理解并尊重 Activity 生命周期。
对于像您的应用程序这样简单的东西,"most direct" 方法是使用 intent 和 startActivityForResult 并在您的主 [=19] 中实现 onActivityResult =].
您将 运行 遇到的问题是,即使您正确地传递给您 Activity 引用,也不能保证它们同时 运行ning。
除了 Intents 之外的其他方式,是使用不涉及 Activity 的 class(s)。扩展应用程序的 class 中的后台服务或静态变量。我很少使用应用程序 classes 来支持服务和绑定活动。
如果我在项目中使用 EventBus,它们可以发送 Sticky 事件,这些事件将保留数据直到被清除。
Android 使用消息传递机制在其组件之间进行通信。此消息传递机制对 Android 至关重要,因此您应该使用它。正如您已经说过的,消息传递是由 Intents 实现的。 ;-)
如果您想要更复杂的东西,请使用 EventBus 或实现您自己的 subscribe/publish 机制来满足您的需求。
使用静态变量
示例
在您的 MainActivity 中定义
public static String msg = null;
然后在您的 ChangeText 中 activity 将更改后的文本分配给它,例如
MainActivity.msg = edittext.getText().toString();
现在在您的主要 activity 重写 onResume() 方法
if(msg != null){
textview.setText(msg);
msg = null;
}
您必须使用 LocalBroadCast Manager 才能这样做
这是 MainActivity,其中包含必须由另一个 Activity
更新的 TextView import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt=(TextView)findViewById(R.id.txt1);
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
new IntentFilter("custom-event-name"));
}
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String s1= intent.getStringExtra("myString");
getIt(s1);
}
};
@Override
protected void onDestroy() {
// Unregister since the activity is about to be closed.
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
public void getIt(String s)
{
System.out.println(s);
txt.setText(s);
}
public void go(View view)
{
Intent intent = new Intent(this,WriteText.class);
startActivity(intent);
}
}
这是 Activity,其中包含更新前一个 activity
中的 TextView 的 EditText import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
public class WriteText extends Activity {
EditText ed1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_write_text);
ed1 = (EditText)findViewById(R.id.textView);
}
public void come(View view){
Intent intent = new Intent("custom-event-name");
intent.putExtra("myString", ed1.getText().toString());
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
这对我有用,希望对你也有用