无法从另一个 class 访问我的自定义视图对象

Not being able to access my custom view object from another class

一段时间以来,我一直在努力寻找解决问题的方法,但无济于事。我有一个 customView class,我将其静态添加到 MainActivitylayout 中(我将其添加到 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 中,这样我就可以在 SecondActivity 中使用 viewer 但这不起作用,因为 findViewById 是非静态的。

我也试过添加这个:

CustomView viewer = (CustomView) ((Activity)context).findViewById(R.id.custom);

SecondActivity 中,但随后我会收到一个错误,提示我正在对空引用调用 findViewById

我不完全确定我能做什么,我在网上和 SO 中搜索了很多,但我仍然无法解决问题。

我仍然是 android 的初学者,所以如果有人设法帮助我,我将不胜感激。

谢谢!

您无法访问 secondActivity 中的 firstActivityviews。更好的方法是使用 intent.putExtra() 方法将数据传递给 secondActivity。如果您需要返回 firstActivity 的结果,您可以使用 startActivityForResult() 方法将 result 返回 firstActivity

您不能在 activities 中引用 view。您需要在 R.layout.activity_secondR.layout.activity_main 布局中使用 ID R.id.customcustomView

您可以将 Activity 视为 class 管理器 screen.When 您开始时绘制的内容 SecondActivity 它本质上是重新绘制您的 MainActivity 使用 R.layout.activity_main.

创建

此外,如果您不想像其他答案建议的那样采用 Intent 方式,跨活动引用同一对象的一种方法是将其保留在应用程序 Context 中。所以你可以有这样的东西:

  1. 创建一个CustomViewManager单例class
  2. CustomViewManager 的对象实例化到您的应用程序 class。
  3. 在您的 MainActivity 中,在您的 startActivity 方法调用之前:将值从 customview 设置为 CustomViewManager 对象。
  4. 在你的 SecondActivity 中,将 CustomViewManager 引用到 customview 的 get/set 值。

通过这种方式,您可以将您的临时演员发送给班级中的另一个 activity:

Intent intent = new Intent(ClassA.this, ClassB.class);
            intent.putExtra("A", "A");
            startActivity(intent);

并在 B 类接收:

Intent intent = getIntent();
Bundle extras = intent.getExtras();

if (extras != null) {
    if (extras.containsKey("A")) {
        //do your stuff
    }
}

一个糟糕的方法 - 但你的代码有效

您尝试使用

 public static CustomView viewer = (CustomView) findViewById(R.id.custom);

在 MainActivity 中。假设你在 MainActivity 之后开始 SecondActivity,你可以通过将上面的语句分成两部分来让它工作。首先定义变量并在调用 setContentView 后在 MainActivity 的 onCreate 中初始化它,如下所示:

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
}

您的代码不起作用,因为您的 MainActivity 布局的 CustomViewsetContentView 之前不可用。

A good Approach

Views contain Context and as they invite memory leaks. As the other answers suggest you should get all the data from your CustomView in the MainActivity itself and then you should pass it to SecondActivity via Intent.