【问题标题】:How to pass data between Activities in Android如何在Android中的Activity之间传递数据
【发布时间】:2020-10-01 20:41:35
【问题描述】:

如何在 Android 中的活动之间传递数据?

示例:我创建了一个群组 CardView 在第二个活动中,我收集了这张卡片 (它向用户显示此活动中有多少卡)

我想将卡号传递给第一个活动

第二次活动

public class Skin extends AppCompatActivity   {
    private Toolbar toolbar;
    public TextView tx;
    private  static  int mysize;
    public List<SettersAndGetters> lstPress;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mainm);
        TextView tt = (TextView) findViewById(R.id.titel_card);
        Button add = (Button) findViewById(R.id.add);

        toolbar = (Toolbar) findViewById(R.id.toolbar20);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                v.setFocusableInTouchMode(true);
                v.requestFocus();
                onBackPressed();
            }
        });


        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Skin.this, ADD.class);
                startActivity(intent);
            }
        });

//The contents of the card that you collected
        tt.setText(R.string.cn1);

        lstPress = new ArrayList<>();
        lstPress.add(new SettersAndGetters(R.string.cr5, R.string.c2, R.string.com1, R.string.des5, R.drawable.p5, 120, 55, 10000005));
        lstPress.add(new SettersAndGetters(R.string.cr1, R.string.c2, R.string.com1, R.string.des1, R.drawable.p2, 12, 12, 1800000));
        lstPress.add(new SettersAndGetters(R.string.cr1, R.string.c2, R.string.com1, R.string.des1, R.drawable.p2, 12, 12, 1800000));
        lstPress.add(new SettersAndGetters(R.string.cr1, R.string.c2, R.string.com1, R.string.des1, R.drawable.p2, 12, 12, 1800000));
        lstPress.add(new SettersAndGetters(R.string.cr1, R.string.c2, R.string.com1, R.string.des1, R.drawable.p2, 12, 12, 1800000));
        lstPress.add(new SettersAndGetters(R.string.cr1, R.string.c2, R.string.com1, R.string.des1, R.drawable.p2, 12, 12, 1800000));

        tx = (TextView) findViewById(R.id.c);
        int size = lstPress.size();     //here This line works great for me, but I want it in the first class (pass it to a class before it)
        tx.setText("" + size);
        mysize=size;



        Toast.makeText(getApplicationContext(),"Size="+size,Toast.LENGTH_LONG).show();




        RecyclerView myr = (RecyclerView) findViewById(R.id.recycler_view);
        RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(this, lstPress);
        myr.setLayoutManager(new GridLayoutManager(this, 2));
        myr.setAdapter(myAdapter);



    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        return true;

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_add, menu);
        // Inflate switch
        ImageButton re = (ImageButton) menu.findItem(R.id.item_switch2)
                .getActionView().findViewById(R.id.back2);






        re.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
                Toast.makeText(Skin.this, "hhi", Toast.LENGTH_SHORT).show();
            }
        });



        ImageButton btnubload = (ImageButton) menu.findItem(R.id.item_switch2)
                .getActionView().findViewById(R.id.btnaddUPLOAD);






        btnubload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Skin.this, ADD.class);
                startActivity(intent);



            }
        });





        return true;




    }

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));
    }

    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }




public static int getMysize(){


        return mysize;

}


}

MainActivity 是第一个活动

    public class MainActivity extends AppCompatActivity implements BootShett.BottomSheetListener {


protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mainm);
        TextView tt = (TextView) findViewById(R.id.Number_of_badges)


 int c=Skin.getMysize();
        tt.setText(""+c);


}

【问题讨论】:

    标签: java android android-studio class


    【解决方案1】:

    要在活动之间传递数据,请使用Intents

    例如在打开一个Activity之前设置一些数据:

    Intent intent = new Intent(Skin.this, ADD.class);
    intent.putExtra("key_a", "hello world");
    intent.putExtra("key_b", 123);
    intent.putExtra("key_c", true);
    startActivity(intent);
    

    并在其他活动中检索它:

    protected void onCreate(Bundle savedInstanceState) {
        ....
        final String valueA = this.getIntent().getStringExtra("key_a");
        final int valueB = this.getIntent().getIntExtra("key_b", 0);
        final boolean valueC = this.getIntent().getBooleanExtra("key_c", false);
        ....
    }
    

    如果改为,则需要从第二个活动返回一个值,因此在反向模式下,然后使用startActivityForResult(而不是 startActivity)启动第二个活动,然后在第一个活动中覆盖活动onActivityResult 方法来处理结果。有关从活动返回值的更多文档,请参阅 this link

    例子:

    1. 在第一个活动中,您必须使用 startActivityForResult 开始第二个活动:

      Intent intent = new Intent(this, SecondActivity.class);  
      this.startActivityForResult(intent, YUR_REQUEST_CODE);
      
    2. 在第二个activity调用finish关闭它之前,使用setResult设置返回值:

      public void onClick(View view) { 
         final Intent intent = new Intent();  
         intent.putExtra("key_a", 1234567890);  
         setResult(YUR_REQUEST_CODE, intent);  
         finish();
      }  
      
    3. 当回到第一个活动时,你会自动在 onActivityResult

      方法中得到结果
      @Override  
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
      
         if (requestCode == YOUR_REQUEST_CODE) {
            final int value = data.getIntExtra("key_a", 0);
             ....
         }
      

      }

    【讨论】:

    • 我想传递 int,而不是 String
    • 使用 putExtra,您可以传递任何您想要的值,Ints、Strings、Booleans 等。Intent 类有几个针对不同数据类型的重载。要检索它,请使用您需要的 Intent 中的任何方法,因此对于 Ints,您有 intent.getIntExtra()
    • 不工作 final int value = this.getIntent().getIntExtra()("a_key");
    • 我想以相反的方式将卷从 Class 2 移动到 Class 1
    • 然后查看答案的底部,对于反向,您必须使用 startActivityForResult(而不是 startActivity)启动第二个活动,并在第一个活动中覆盖 onActivityResult 方法以获取值。查看链接。
    【解决方案2】:

    您还可以使用共享首选项:

    在第一个活动中添加此代码

    SharedPreferences sp;
    sp = getSharedPreferences("card",MODE_PRIVATE);
    int cardNumber = Skin.getMysize();
    sp.edit().putInt("card_number", cardNumber).apply();
    

    在第二个活动中添加此代码

    SharedPreferences sp;
    sp = getSharedPreferences("card",MODE_PRIVATE);
    int cardNumber = sp.getInt("card_number", "");
    

    【讨论】:

      【解决方案3】:

      在这种情况下,只需在刚刚放置的第二个活动中执行此操作:

      Intent intent = new Intent();
      intent.putExtra(key, value);
      setResult(result key, intent); 
      finish();
      

      在您的第一个活动中,通过 onActivityResult 获取结果

      【讨论】:

      • 你是不是用同一个key,我把答案改成了getIntent() not get intent()
      • 朋友,我想把(int size = lstPress.size()) 数据从二等班传到一等班: 操作是向后的,这样在进入二等班之前,有多少张牌出现在头等舱
      猜你喜欢
      • 1970-01-01
      • 2017-01-29
      • 2014-05-25
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多