0
votes

Pourquoi je ne reçois pas de données dans une autre activité de l'activité précédente en utilisant l'interface dans Android

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);

    }
}


0 commentaires

4 Réponses :


1
votes

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


5 commentaires

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.



2
votes

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:

  • Implémente l'interface.
  • Une classe contient une instance de l'interface qui pointe vers l'objet de la classe B

Dans votre exemple. l'instance de SecondActivity n'est pas créée par vous donc ce n'est pas possible.


0 commentaires

1
votes

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();
  }


1 commentaires

C'est techniquement possible mais cela impliquerait de la statique et ce serait généralement dangereux.



1
votes

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;
    }
}


0 commentaires