无法从另一个班级

时间:2017-10-21 13:11:38

标签: java android android-intent android-view findviewbyid

我一直试图找到解决问题的方法已经有一段时间但是无济于事。我有一个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的初学者,所以如果有人设法帮助我,我将不胜感激。

谢谢!

4 个答案:

答案 0 :(得分:1)

您无法访问viewsfirstActivity的{​​{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}}布局不可用。

  

一个好方法

     

视图包含setContentViewContext should not be put in static fields,因为它们会引发内存泄漏。正如其他答案所示,您应该从Context本身的CustomView获取所有数据,然后通过MainActivity将其传递给SecondActivity

答案 3 :(得分:0)

您无法在view之间引用activities。您需要在customViewR.id.custom布局中使用身份R.layout.activity_second的{​​{1}}。

您可以将R.layout.activity_main视为管理屏幕上绘制内容的类。当您开始Activity时,它基本上会重新绘制SecondActivity使用MainActivity创建的内容

此外,如果您不想像其他答案所提出的那样采用R.layout.activity_main方式,那么跨活动引用同一个对象的一种方法是将其保留在应用程序Intent中。所以你可以有类似的东西:

  1. 制作Context单件类
  2. CustomViewManager的对象实例化为您的应用程序类。
  3. CustomViewManagerMainActivity方法调用之前:将值从startActivity设置为customview对象。
  4. CustomViewManager参考SecondActivity获取/设置CustomViewManager的值。