我一直试图找到解决问题的方法已经有一段时间但是无济于事。我有一个customView
课程,我将其静态添加到我的MainActivity
layout
中(我将其添加到XML文件中)。我有第二个Activity
需要访问我的customView
方法,因为它会从中检索数据并更改一些数据。但是,我的第二个activity
只需要访问已添加到MainActivity
的自定义视图的同一对象。
我希望它看起来像这样:
在 MainActivity.java
中,我会这样做:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.btnID);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent btnIntent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(btnIntent);
}
});
}
在 SecondActivity
中,它会是这样的:
public class SecondActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
CustomView viewer = (CustomView) findViewById(R.id.custom); //I want to link to the view I added in the MainActivity
viewer.getData(); // Example of what methods I want to use here
viewer.setData(); // It should directly set/get the data from the object in the MainActivity
到目前为止,我已经尝试过这个:
public static CustomView viewer = (CustomView) findViewById(R.id.custom);
在MainActivity
中,我可以在viewer
中使用SecondActivity
,但由于findViewById
是非静态的,因此无效。
我也试过添加这个:
CustomView viewer = (CustomView) ((Activity)context).findViewById(R.id.custom);
在SecondActivity
但是我会收到一个错误,我在空引用上调用findViewById
。
我不完全确定自己能做什么,我已经在网上搜索了很多,但我仍然无法解决问题。
我仍然是Android的初学者,所以如果有人设法帮助我,我将不胜感激。
谢谢!
答案 0 :(得分:1)
您无法访问views
中firstActivity
的{{1}}。更好的方法是使用secondActivity
方法将数据传递到secondActivity
。如果您需要将结果返回到intent.putExtra()
,则可以使用firstActivity
方法将startActivityForResult()
恢复为result
答案 1 :(得分:1)
通过这种方式,您可以将您的额外内容发送到ClassA的其他活动:
Intent intent = new Intent(ClassA.this, ClassB.class);
intent.putExtra("A", "A");
startActivity(intent);
在ClassB收到它:
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
if (extras.containsKey("A")) {
//do your stuff
}
}
答案 2 :(得分:1)
糟糕的做法 - 但您的代码有效
您尝试使用
public static CustomView viewer = (CustomView) findViewById(R.id.custom);
MainActivity中的。假设您在SecondActivity
之后开始MainActivity
,您可以通过将上述语句分为两部分来使其工作。首先定义变量并在调用onCreate
之后在MainActivity的setContentView
中对其进行初始化,如下所示:
public class MainActivity extends AppCompatActivity {
public static CustomView viewer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewer = (CustomView) findViewById(R.id.custom);
Button btn = (Button) findViewById(R.id.btnID);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent btnIntent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(btnIntent);
}
});
}
现在在SecondActivity
public class SecondActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
MainActivity.viewer.getData(); // Example of what methods I want to use here
MainActivity.viewer.setData(); // It should directly set/get the data from the object in the MainActivity
}
您的代码无效,因为CustomView
之前MainActivity
的{{1}}布局不可用。
一个好方法
视图包含
setContentView
和Context should not be put in static fields,因为它们会引发内存泄漏。正如其他答案所示,您应该从Context
本身的CustomView
获取所有数据,然后通过MainActivity
将其传递给SecondActivity
。
答案 3 :(得分:0)
您无法在view
之间引用activities
。您需要在customView
和R.id.custom
布局中使用身份R.layout.activity_second
的{{1}}。
您可以将R.layout.activity_main
视为管理屏幕上绘制内容的类。当您开始Activity
时,它基本上会重新绘制SecondActivity
使用MainActivity
创建的内容
此外,如果您不想像其他答案所提出的那样采用R.layout.activity_main
方式,那么跨活动引用同一个对象的一种方法是将其保留在应用程序Intent
中。所以你可以有类似的东西:
Context
单件类CustomViewManager
的对象实例化为您的应用程序类。CustomViewManager
,MainActivity
方法调用之前:将值从startActivity
设置为customview
对象。CustomViewManager
参考SecondActivity
获取/设置CustomViewManager
的值。