如何在Android中将数据从一个活动发送到另一个活动

时间:2019-06-04 13:11:35

标签: java android

我已经在其中创建了一个齐射列表,我在从适配器到活动以及从此活动到另一个活动的数据获取方面存在问题。我收到错误无法将activity.java强制转换为anotherActivity.java ,以下是我的代码。请任何人帮助我。

“我的界面”项在适配器类中单击

private OnItemClickGetPlaylist mListener;
public interface OnItemClickGetPlaylist{
    public void OnPlaylistItemClick(String playlistName,int numOfItems,String imageViewForPlaylist);
}
public void setOnClickListenerOnPlaylist(OnItemClickGetPlaylist listener)
{
    mListener = listener;
}
 holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String id = playlist.getId_playlist_identify();
            String PlaylistName = playlist.getTitile_of_playlist();
            String imageOfPlaylist = playlist.getImage_of_playlist();
            int numOfPlaylistSongs = getItemCount();
            SendIdToDatabase(id);
            if (mListener != null)
            {
                mListener.OnPlaylistItemClick(PlaylistName,numOfPlaylistSongs,imageOfPlaylist);
            }
            else {
                Toast.makeText(context, "mListeren is null" + mListener, Toast.LENGTH_SHORT).show();
            }
        }
    });

获取数据句柄后,在代码下方的“活动”中单击

public void OnItemClickHandleInPlaylistActivity(String playlistName,int numOfItems,String imageViewForPlaylist)
{

///这是适配器项单击活动,现在我想无意间将该数据发送到另一个活动,请帮助我。

//我已经实现了以下代码,但它无法使活动转换为另一个活动错误。

((anotherActivity) getApplicationContext()).OnItemClickInMusicActivity(playlistName,numOfItems,imageViewForPlaylist);
}

4 个答案:

答案 0 :(得分:1)

https://stackoverflow.com/a/47637313/2413303上查看解决方案

public class MyApplication extends Application {
    private static MyApplication INSTANCE;

    DataRepository dataRepository; // this is YOUR class

    @Override
    public void onCreate() {
        super.onCreate();
        INSTANCE = this;
        dataRepository = new DataRepository();
    }

    public static MyApplication get() {
        return INSTANCE;
    }
}

DataRepository应该公开LiveData:

public class DataRepository {
    private final MutableLiveData<MyData> data = new MutableLiveData<>();

    public LiveData<MyData> getMyData() {
        return data;
    }

    public void updateText(String text) {
        MyData newData = data.getValue()
                             .toBuilder() // immutable new copy
                             .setText(text)
                             .build();
        data.setValue(newData);
    }
}

活动在哪里订阅:

public class MyActivity extends AppCompatActivity {
    DataRepository dataRepository;

    TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyApplication app = (MyApplication)getApplicationContext();
        dataRepository = app.getDataRepository();

        setContentView(R.layout.main_activity);
        textView = findViewById(R.id.textview);

        dataRepository.getMyData().observe(this, new Observer() {
            @Override
            public void onChange(MyObject myObject) {
                textView.setText(myObject.getText());
            }
        }
    }

因此,要更新此文本,您需要获取DataRepository类,并在其上调用updateText

DataRepository dataRepository = MyApplication.get().dataRepository();
dataRepository.updateText("my new text");

请确保DataRepository中的数据正确保存在某个地方,或者至少可以在进程终止后再次获取。例如,您可能要使用数据库(而不是共享首选项)。

答案 1 :(得分:0)

我发现最好使用回调。

在ClassA中: 创建界面

MyCallback callback;

viod setCallback(MyCallback callback){
this.callback = callback;
}
viod onStop(){
    callback = null;
}

interface MyCallback{
    void doSomething(Params params);
}
B类中的

: 实施MyCallback

public class ClassB **implements ClassA.MyCallback**

在onCreate中设置引用

ClassA classA = new ClassA();
classA.setCallback(this);

//覆盖方法doSomething

@override
void doSomething(Params params){
 //do your thing with the params…
}

在A类调用中完成工作时:

callback.doSomething(params);

onStop()中B类内部的销毁引用

classA.onStop();

答案 2 :(得分:0)

如果您不想使用Intent,也许可以使用发布/订阅体系结构。有一个很容易使用的名为eventbus(org.greenrobot:eventbus)的库,可以实现您想要的。

答案 3 :(得分:0)

改为使用应用程序类。

public class MyApplicationClass extends Application{
       @Override
       public void onCreate() {
          super.onCreate();
          ///do something on create
    }
       getterMethods(){...}
       setterMethods(){...}
}

然后将android:name=".MyApplicationClass"添加到清单文件

现在您可以通过以下方式访问类中的方法

MyApplicationClass applicationClass = (MyApplicationClass)getApplicationContext();
int id = applicationClass .getterMethod().getID;
String playListName = applicationClass .getterMethod().getPlayListName();

,对于Setter()反之亦然; 之后,您可以将其用于整个应用程序中的数据获取和设置数据。

希望它会有所帮助:)

参考:   https://guides.codepath.com/android/Understanding-the-Android-Application-Class