繁体   English   中英

在活动之间传递值

[英]Passing values between activity

我应该在MainActivity "stringadaA" 和 "numerodaB" 中显示 2 TextView ,即放入 2 个活动 A 和 B 中的字符串和数字。这些值不能在活动之间的转换中丢失,但必须仅在更改时更改由用户。 我设法做到了,但是当我按下“Ritorna”按钮返回MainActivity它并没有像我预期的那样保留两个结果,如果我在ActivityAActivityB插入值,为什么不能同时保存两者?

提前致谢

public class MainActivity extends Activity {
    TextView stringaA;
    TextView numeroB;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        stringaA = findViewById(R.id.stringadaA);
         numeroB= findViewById(R.id.numerodaB);
        Button btnA = findViewById(R.id.btnactivitya);
        Button btnB= findViewById(R.id.btnactivityb);
        final EditText editText= findViewById(R.id.editactivitya);
        btnA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(getApplicationContext(), ActivityA.class);
                startActivity(i);
            }
        });
        Bundle extras= getIntent().getExtras();
        if (extras!=null){
            String value = extras.getString("stringaA");
            String number =extras.getString("numero");
            stringaA.setText(value);
            numeroB.setText(number);
        }

        btnB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(getApplicationContext(), ActivityB.class);
                startActivity(i);

            }
        });

    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        String stringa= stringaA.getText().toString();
        outState.putString("STRINGA", stringa);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        String stringa= savedInstanceState.getString("STRINGA");

    }
}

public class ActivityA extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);

        final EditText edtA= findViewById(R.id.editactivitya);
        Button returnbtnA= findViewById(R.id.ritornaallaprincipaleA);
        returnbtnA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Intent i = new Intent(getApplicationContext(), MainActivity.class);
               i.putExtra("stringaA", edtA.getText().toString());
               startActivity(i);

            }
        });
    }
}
public class ActivityB extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);

        final EditText edtb= findViewById(R.id.editactivityb);
        Button returnbtnb= findViewById(R.id.ritornaallaprincipaleB);
        returnbtnb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(getApplicationContext(), MainActivity.class);
                i.putExtra("numero", edtb.getText().toString());
                startActivity(i);
            }
        });
    }
}

代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".MainActivity">

 <TextView
     android:id="@+id/testo1"
     android:textSize="30dp"
     android:layout_marginTop="30dp"
     android:layout_centerHorizontal="true"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="Main Activity"
     app:layout_constraintBottom_toBottomOf="parent"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     app:layout_constraintTop_toTopOf="parent" />

 <Button
         android:id="@+id/btnactivitya"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="30dp"
         android:textSize="20dp"
         android:text="Activity A"
         android:layout_below="@+id/testo1"
         android:layout_centerHorizontal="true"
     />
 <Button
     android:id="@+id/btnactivityb"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_marginTop="30dp"
     android:textSize="20dp"
     android:text="Activity B"
     android:layout_below="@+id/btnactivitya"
     android:layout_centerHorizontal="true"/>

 <TextView
     android:id="@+id/stringaA"
     android:layout_below="@id/btnactivityb"
     android:layout_width="wrap_content"
     android:layout_marginTop="30dp"
     android:layout_centerHorizontal="true"
     android:layout_height="wrap_content"
     android:text="Stringa da Activity A:"/>

 <TextView
     android:id="@+id/stringadaA"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_below="@+id/stringaA"
     android:layout_centerHorizontal="true"
     android:textSize="20dp"
     android:layout_marginTop="30dp"/>
 <TextView
     android:id="@+id/stringaB"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
    android:text="Numero da Activity B"
     android:layout_marginTop="20dp"
     android:layout_below="@+id/stringadaA"
     android:layout_centerHorizontal="true"/>
 <TextView
     android:id="@+id/numerodaB"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_below="@+id/stringaB"
     android:layout_centerHorizontal="true"
     android:layout_marginTop="20dp"
     android:textSize="20dp"
 />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/ActivityA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30dp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40dp"
        android:text="Activity A"/>
    <TextView
        android:id="@+id/InserisciA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="90dp"
        android:layout_centerInParent="true"
        android:textSize="20dp"
        android:layout_below="@+id/ActivityA"
        android:text="Inserisci stringa"/>
    <EditText
        android:id="@+id/editactivitya"
        android:layout_marginTop="20dp"
        android:layout_below="@+id/InserisciA"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:width="100dp"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/ritornaallaprincipaleA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editactivitya"
        android:layout_alignStart="@+id/InserisciA"
        android:layout_marginStart="3dp"
        android:layout_marginTop="25dp"
        android:text="Ritorna"
        android:textSize="20dp" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/ActivityB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30dp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40dp"
        android:text="Activity B"/>
    <TextView
        android:id="@+id/InserisciB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:layout_centerHorizontal="true"
        android:layout_centerInParent="true"
        android:layout_below="@+id/ActivityA"
        android:text="Inserisci numero"/>
    <EditText
        android:id="@+id/editactivityb"
        android:layout_below="@+id/InserisciB"
        android:layout_centerHorizontal="true"
        android:width="100dp"
        android:layout_marginTop="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/ritornaallaprincipaleB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Ritorna"
        android:textSize="20dp"
        android:layout_marginTop="40dp"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/editactivityb"/>
</RelativeLayout>

使用 startActivityForResult 方法调用 ActivityA 和 ActivityB。 并覆盖 MainActivity 中的 onActivityResult 方法。

  1. 这里, 100 是 ActivityA 的 int 值请求代码:
Intent i = new Intent(MainActivity.this, ActivityA.class);    
startActivityForResult(i,100);
  1. 此处:此处,101 是 ActivityB 的 int 值请求代码:
Intent i = new Intent(MainActivity.this, ActivityB.class);
startActivityForResult(i,101);
  1. 在ActivityA,这里,结果代码是RESULT_OK
Intent i = new Intent();
i.putExtra("stringaA", edtA.getText().toString());
setResult(RESULT_OK,i);
finish();
  1. 在ActivityB中,这里的结果代码是RESULT_OK
Intent i = new Intent();
i.putExtra("numero", edtb.getText().toString());
setResult(RESULT_OK,i);
finish();
  1. 覆盖 MainActity 类中的 onActivityResult(int requestCode,int resultCode,Intent data) 方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent 
        data {
    super.onActivityResult(requestCode, resultCode, data);  
    switch(requestCode){  
        case 100:  
            stringaA.setText(data.getStringExtra("stringaA"));  
            break;  
        case 101:  
            numeroB.setText(data.getStringExtra("numero"));  
            break;  
    }
}

正在按预期工作,您通过 Intent 从两个创建的Activity之一开始,然后返回MainActivity并且只有一个结果。 不是他们两个,这是因为它不会保留在内存中,因为您从Activity AActivity B MainActivity ,这不是这样做的方法,即使可以工作。

您想要做的是了解 Android 中活动的后台堆栈如何工作,并在以这种方式单击“Ritorna”时发出finish()命令,活动将终止并使用 onActivityResult(),如此链接中所述将返回结果(而不是再次向 MainActivity 启动显式 Intent,您将终止片段并将结果返回给 MainActivity,这样将在 MainActivity 中可用,因为您将拥有 MainActivity 下面和顶部的活动之一) 返回结果后,将其分配给 TextView 并将保留在内存中!

你问我关于在关闭和打开应用程序时维护数据的第二件事可以通过多种方式获得。 一个是通过SharedPreferences另一个是通过数据库,例如RoomMySQL

编辑:回复您的评论,您可以添加属性

android:inputType="number" 只接受数字

如果你只想要字符串,例如字母,你可以使用这个属性

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" >

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM