我的项目中有两个活动(ChooseLevel和ShowTraining)。在第一个活动中我有一个Button,在第二个活动中我有一个Textview。
我的问题是,当我尝试单击按钮(并以意图启动第二个活动)时,我想更改第二个活动的textview文本,但我的应用程序崩溃了。我已经在stackoverflow上搜索了一些帖子,但问题仍然存在。
这是第一堂课:
public class ChooseLevel extends AppCompatActivity {
Button firstlevel;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_level);
firstlevel = (Button)findViewById(R.id.firstlevelBtn);
tv = (TextView)findViewById(R.id.titleTextTraining); //this is the textview of the second activity
firstlevel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//start the second activity
Intent showTrainings = new Intent(ChooseLevel.this, ShowTrainings.class);
startActivity(showTrainings);
tv.setText("Some text here"); //change the text of the textview
}
});
}
这两项活动的XML文件都可以。 我怎么解决? 谢谢大家
答案 0 :(得分:1)
简单地说,你不能用findViewById()做你想做的事。
findViewById()在调用视图的内容中查找请求的视图。
因此,如果您从活动中调用它,它将在您使用setContentView()设置的contentView上查找视图,这就是为什么它返回null。
您应该通过Intent extra将文本传递给第二个活动,然后在设置第二个活动的contentView之前,您可以调用findViewById()并更改其文本。
通过意图传递文本
Intent showTrainings = new Intent(ChooseLevel.this, ShowTrainings.class);
showTraining.putStringExtra("extrakey","YourTextHere");
然后在另一边
String text = getIntent().getStringExtra("extrakey");
希望这有帮助。
答案 1 :(得分:0)
tv = (TextView)findViewById(R.id.titleTextTraining);
TextView
1时,您无法在Activity
2中获得Activity
。
您应该跳至Activity
2并更改其中的TextView
。
答案 2 :(得分:0)
将textText设置为第二个Activity的一种方法是将值从第一个Activity传递给第二个Activity,在这种情况下,您可以使用intent.putExtra()
方法。那你怎么做的?
好吧,在第一个类中,即传递数据的类,
public class ChooseLevel extends AppCompatActivity {
Button firstlevel;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_level);
firstlevel = (Button)findViewById(R.id.firstlevelBtn);
//tv = (TextView)findViewById(R.id.titleTextTraining); //this is the textview of the second activity
firstlevel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//start the second activity
Intent showTrainings = new Intent(ChooseLevel.this, ShowTrainings.class);
showTrainings.putExtra("TEXTID", "THE TEXT YOU WANT TO PASS");
startActivity(showTrainings);
}
});
}
在showTrainings
课程中,您可以收到以下值:
String receive;
if (savedInstanceState == null) {
Bundle extras = getIntent().getExtras();
if(extras == null) {
receive= null;
} else {
receive= extras.getString("TEXTID");
}
} else {
receive= (String) savedInstanceState.getSerializable("TEXTID");
}
然后您可以将收到的文本设置为TextView
,如:
tv = (TextView)findViewById(R.id.titleTextTraining);
tv.setText(receive);
答案 3 :(得分:0)
这样做:
<强> ChooseLevel.java 强>
public class ChooseLevel extends Activity {
Button firstlevel;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_level);
firstlevel = (Button)findViewById(R.id.firstlevelBtn);
firstlevel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//start the second activity
Intent showTrainings = new Intent(ChooseLevel.this, ShowTrainings.class);
showTrainings.putExtra("textValue", "Some Text");
startActivity(showTrainings);
}
});
}
}
<强> ShowTrainings.java 强>
public class ShowTrainings extends Activity {
Button firstlevel;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_level);
tv = (TextView)findViewById(R.id.titleTextTraining);
String str = getIntent().getStringExtra("textValue");
if(str != null) {
tv.setText(str);
}
}
}