Bien que je sache obtenir et mettre en place des extras que nous pouvons utiliser dans l'intention de passer à une autre activité, j'essaie simplement de savoir s'il est possible de stocker et d'obtenir les données via l'interface. J'ai stocké les données mais dans une autre activité, je ne suis pas en mesure d'obtenir les données.
Voici ce que j'ai fatigué.
interface PassDataToOtherActivity { public void passData(String data); @SuppressLint("NewApi") default void setData(String s) { } public class MainActivity extends AppCompatActivity implements PassDataToOtherActivity { private TextView textView; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.first_text); button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); textView.setText("Hello Test"); setData(textView.getText().toString()); passData(textView.getText().toString()); } @Override public void passData(String data) { //override methods } } public class SecondActivity extends AppCompatActivity implements PassDataToOtherActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); textView = findViewById(R.id.textView_2); } @Override public void passData(String data) { //why i am not getting the datas from previous activity? textView.setText(data); } @Override public void setData(String data) { //why I am not able to get the datas from previous activity? textView.setText(data); } }
4 Réponses :
Vous devriez utiliser des extras sur les intentions, c'est beaucoup plus efficace. Transmettez les données de MainActivity:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); String dataPassed = getIntent().getStringExtra("TEXT_TO_PASS"); }
Ensuite, récupérez-les depuis SecondActivity:
Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("TEXT_TO_PASS", "Hello Test"); startActivity(intent);
En savoir plus sur la transmission de données entre activités ici
J'ai déjà spécifié en première ligne que je ne veux pas utiliser put et getExtras. Si je peux utiliser cela, alors quelle est l'utilité de l'interface?
Eh bien, l'interface est inutile dans ce cas. Interface est un contrat qui oblige vos deux activités à mettre en œuvre ces méthodes, mais elles ne sont connectées à aucun moment. Fondamentalement, une interface est utilisée pour s'assurer que les classes ont le même comportement et les mêmes méthodes, elle ne stocke pas de données. Si vous voulez contourner les extras, vous pouvez créer une classe de gestionnaire, qui n'est rien de plus qu'une classe java dans celle où vous affecterez certaines données dans les attributs.
Je ne veux pas utiliser put et getExtras
pas de chance, car vous devriez utiliser des extras d'intention, sinon votre application aura des plantages auxquels vous ne vous attendiez pas Si je peux utiliser cela, alors à quoi sert alors l'interface?
l'interface que vous avez ajoutée est inutile car vous ne pourrez pas obtenir de référence à l'autre activité, donc la réponse est "Je n'ai aucune idée, mais vous n'auriez pas dû l'être faire ça de toute façon ".
Nous pouvons réaliser grâce à la classe singleton @CorentinHoudayer
@Shadow Vous avez raison, j'irais pour ça si je devais le faire.
Implémenter une interface sur une classe ne signifie pas qu'elle recevrait l'appel automatiquement.
Par exemple Une classe ne peut transmettre des données à la classe B que si la classe B:
Dans votre exemple. l'instance de SecondActivity n'est pas créée par vous donc ce n'est pas possible.
Non, il n'est pas possible de passer des données entre les activités via l'interface.
La raison pour laquelle, pour travailler avec l'interface, l'objet d'interface doit être initialisé comme nous le faisons pendant la méthode onAttach () lors du passage de données entre deux fragments.
Mais en cas d'Activité, on ne peut pas passer le contexte à initialiser.
class MainActivity extends AppCompatActivity implements myInterface { onCreate(){ android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); if (fragment != null) { fragmentTransaction.replace(R.id.content_frame, fragment); fragmentTransaction.addToBackStack(fragmentTag); fragmentTransaction.commit(); } } @Override public void onChange(String s) { // your retrieved code } } class MyFragment extends Fragment { private MyInterface interf ; @Override public void onAttach(Context context) { super.onAttach(context); interf = (myInterface) context; } onActivityCreated(){ interf.onChange("Hello"); } } public interface myInterface { void onChange(); }
C'est techniquement possible mais cela impliquerait de la statique et ce serait généralement dangereux.
Sans utiliser put extra et getExtra, vous pouvez réaliser grâce à la classe Singleton.
public class MainActivity extends AppCompatActivity { private TextView textView; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.first_text); button = findViewById(R.id.button); textView.setText("Hello Test"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DataHolder.getInstance().setData(textView.getText().toString()); Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); } } public class SecondActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); textView = findViewById(R.id.textView_2); textView.setText(DataHolder.getInstance().getData()); } }
Vous pouvez maintenant définir les données et obtenir les données dans une autre classe. Ici, je n'ai utilisé aucune autre API fournie par Android, telle que les composants de préférence ou d'intention, pour transmettre et obtenir les données.
public class DataHolder { private static final DataHolder instance = new DataHolder(); public static DataHolder getInstance() { return instance; } private String data; public String getData() { return data; } public void setData(String data) { this.data = data; } }