我对编程很陌生。
我正在尝试使用两个活动创建一个简单的应用程序,其中第二个活动可以更改第一个活动的文本。我知道它可以使用意图完成,但我想知道是否有更直接的方法,例如使用第二个活动从第一个活动调用一个函数?
这是我到目前为止的代码:
MainActivity,包含一个TextView和一个用于打开第二个活动的按钮:
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);
}
}
第二个活动,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中创建一个公共函数来使应用程序工作,该函数接收字符串并使用它设置TextView,然后我从ChangeText活动中调用此函数。
问题:它一直在崩溃!谁能告诉我如何才能使这项工作?
答案 0 :(得分:1)
似乎我大约一周左右回答了几乎完全相同的问题,所以这可能是重复的,但我似乎无法找到原始问题。
简短的回答是否定的 - 你无法从另一个Activity调用Activity中的方法。问题在于,对于正常的编程目的,一次只存在一个Activity *。
如果你做了一些事情来规避这个问题,那么你就冒着引起一些重大问题的风险,包括高内存使用率,空指针异常等等。
这样做的正确方法确实是通过Intent系统。
*
活动可能会或可能不会在它们变为非活动状态时被破坏,具体取决于您如何使用后台堆栈。
但是,如果它们在变为非活动状态时被破坏,则应始终编程 - 阅读,理解并尊重活动生命周期。
答案 1 :(得分:0)
对于像您的应用一样简单的东西,"最直接的"方法是使用intent和startActivityForResult,并在主活动中实现onActivityResult。
您遇到的问题,即使您正确传递了活动参考,也不能保证它们同时运行。
除了Intents之外的其他方法是使用不参与Activity的类。扩展Application的类中的后台服务或静态变量。我很少再使用Application类来支持服务和绑定它们。
如果我在项目中使用EventBus,他们可以发送Sticky事件,这些事件将保存数据直到被清除。
答案 2 :(得分:0)
Android使用消息传递机制在其组件之间进行通信。这种消息传递机制对于Android至关重要,因此您应该使用它。正如您已经说过的,消息传递是由Intents实现的。 ; - )
如果您想要更复杂的东西,请使用EventBus或实现您自己的订阅/发布机制,以满足您的需求。
答案 3 :(得分:0)
使用静态变量
实施例
在您的MainActivity定义
中 public static String msg = null;
然后在您的ChangeText活动中将更改后的文本分配给它
MainActivity.msg = edittext.getText().toString();
现在在您的主活动中覆盖onResume()方法
if(msg != null){
textview.setText(msg);
msg = null;
}
答案 4 :(得分:0)
您必须使用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);
}
}
这是包含EditText的Activity,它更新了上一个活动中的TextView
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);
}
}
这对我有用,希望它也适合你