如何从一个活动到另一个活动接收数据-Android

时间:2019-01-24 15:45:08

标签: java android android-intent android-activity

我正在尝试将一个活动中的一个整数发送到Android Studio中的另一个活动。在我的源类中,我已经使用putExtra()发送了数据,而在接收者类中,我正在尝试使用getIntent()来接收数据。但是,我在接收器类中收到错误“无法解析方法'getIntent()”。这是我的代码:

我是Android Studio和Java的新手,因此,如果我确实缺少一些明显的东西,请多加考虑。

源活动:

public class AugmentedImageActivity extends AppCompatActivity {

  private ArFragment arFragment;
  private ImageView fitToScanView;

  // Augmented image and its associated center pose anchor, keyed by the augmented image in
  // the database.
  private final Map<AugmentedImage, AugmentedImageNode> augmentedImageMap = new HashMap<>();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
    fitToScanView = findViewById(R.id.image_view_fit_to_scan);

    arFragment.getArSceneView().getScene().addOnUpdateListener(this::onUpdateFrame);
  }

  @Override
  protected void onResume() {
    super.onResume();
    if (augmentedImageMap.isEmpty()) {
      fitToScanView.setVisibility(View.VISIBLE);
    }
  }

  /**
   * Registered with the Sceneform Scene object, this method is called at the start of each frame.
   *
   * @param frameTime - time since last frame.
   */
  private void onUpdateFrame(FrameTime frameTime) {
    Frame frame = arFragment.getArSceneView().getArFrame();

    // If there is no frame or ARCore is not tracking yet, just return.
    if (frame == null || frame.getCamera().getTrackingState() != TrackingState.TRACKING) {
      return;
    }

    Collection<AugmentedImage> updatedAugmentedImages =
        frame.getUpdatedTrackables(AugmentedImage.class);
    for (AugmentedImage augmentedImage : updatedAugmentedImages) {
      switch (augmentedImage.getTrackingState()) {
        case PAUSED:
          // When an image is in PAUSED state, but the camera is not PAUSED, it has been detected,
          // but not yet tracked.
            int value=augmentedImage.getIndex();
            Intent i = new Intent(AugmentedImageActivity.this, AugmentedImageNode.class);
            i.putExtra("key",value);
            startActivity(i);
          String text = "Detected Image " + augmentedImage.getIndex();
          SnackbarHelper.getInstance().showMessage(this, text);
          break;

        case TRACKING:
          // Have to switch to UI Thread to update View.
          fitToScanView.setVisibility(View.GONE);

          // Create a new anchor for newly found images.
          if (!augmentedImageMap.containsKey(augmentedImage)) {
            AugmentedImageNode node = new AugmentedImageNode(this);
            node.setImage(augmentedImage);
            augmentedImageMap.put(augmentedImage, node);
            arFragment.getArSceneView().getScene().addChild(node);
          }
          break;

        case STOPPED:
          augmentedImageMap.remove(augmentedImage);
          break;
      }
    }
  }
}

收件人活动:

public class AugmentedImageNode extends AnchorNode {

  private static final String TAG = "AugmentedImageNode";

  // The augmented image represented by this node.
  private AugmentedImage image;

  private static CompletableFuture<ModelRenderable> ulCorner;

  public AugmentedImageNode(Context context) {

       Intent intent = getIntent();
       Bundle extras = intent.getExtras();
       int value = extras.getInt("key");

          if (value == 0) {
              // Upon construction, start loading the models for the corners of the frame.
              if (ulCorner == null) {
                  ulCorner =
                          ModelRenderable.builder()
                                  .setSource(context, Uri.parse("models/tinker.sfb"))
                                  //.setSource(context, Uri.parse("models/borderfence-small2.sfb"))
                                  .build();
                   }
          }
}
@SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"})
  public void setImage(AugmentedImage image) {
    this.image = image;

    // If any of the models are not loaded, then recurse when all are loaded.
    if (!ulCorner.isDone())// || !urCorner.isDone() || !llCorner.isDone() || !lrCorner.isDone())
      {
      CompletableFuture.allOf(ulCorner)//, urCorner, llCorner, lrCorner)
          .thenAccept((Void aVoid) -> setImage(image))
          .exceptionally(
              throwable -> {
                Log.e(TAG, "Exception loading", throwable);
                return null;
              });
    }

    // Set the anchor based on the center of the image.
    setAnchor(image.createAnchor(image.getCenterPose()));

    // Make the 4 corner nodes.
    Vector3 localPosition = new Vector3();
    Node cornerNode;
localPosition.set(-0.0f * image.getExtentX(), 0.1f, +0.5f * image.getExtentZ());
    cornerNode = new Node();
    cornerNode.setParent(this);
    cornerNode.setLocalPosition(localPosition);
    cornerNode.setLocalRotation(Quaternion.axisAngle(new Vector3(-1f, 0, 0), 90f));
    cornerNode.setRenderable(ulCorner.getNow(null));
}

    private void setLocalRotation() {
    }

    public AugmentedImage getImage() {
    return image;
  }
}

4 个答案:

答案 0 :(得分:2)

getIntent()方法仅在扩展activity [直接或间接]

的类中可用。

答案 1 :(得分:0)

在收件人活动中删除AugmentedImageNode(上下文上下文)的前三行,并替换为以下内容

 int value = getIntent().getIntExtra("key",0);

其中0只是默认值。

答案 2 :(得分:0)

以下是在您的方案中如何使用共享首选项的代码。希望对您有所帮助。

代替下面的代码

canvasWidth = windowWidth;
canvasHeight = windowHeight;

使用这个

Intent i = new Intent(AugmentedImageActivity.this, AugmentedImageNode.class);
i.putExtra("key",value);
startActivity(i);

并使用以下代码在AugmentedImageNode屏幕上检索首选项值

 SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
Editor editor = pref.edit();
editor.putInt("Key", "int value");  
editor.commit();

答案 3 :(得分:0)

如果您是扩展活动和AppCompatActivity,则getintent可以正常工作

例如:

MainActivity.java

 choice_a.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent=new Intent(MainActivity.this,SecondActivity.class);

            //putExtra(key name,default value);
            intent.putExtra("int_key",22);
            startActivity(intent);

        }
    });

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

     //get intent values
    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    int value = extras.getInt("int_key");
    Log.e("Int_Value", "" + value);

    // another way
    int i = getIntent().getIntExtra("int_key", 0);
    Log.e("Int_Value", "" + i);
}
}

在您的代码中,您扩展了AnchorNode