安卓:将此对象作为Parcelable将此、对象、Parcelable

2023-09-12 05:43:34 作者:上帝也卖萌

我有我需要2 活动之间传递对象。该对象有哈希表,字符串[],等等。真搞不懂如何使它Parcalebale,这样我可以填充对象的数组,并通过单一的obj或数组其他活动。 我的类是:

I have an object that I need to pass between 2 Activity. The object has HashTable, String[], etc. Can't make out how to make it Parcalebale so that I can populate an array of the object and pass single obj or array to other Activity. My class is :

 public class TrainRoute  { // implements Parcelable
private String RouteName;
private int RouteIndex;

private Context ctx;
private Hashtable<String, String> stationsList;
private String[] stationsNames;
private String[] trainTimings;

private boolean hasSpecialMessages;
private Hashtable<String, String> specialMessages; 

private String firstStation; 
private String CURRENT_ROUTE_PATH;


public TrainRoute(Context ctx, String routeName, int routeIndex, String routeUpOrDownPath, boolean hasSpecialMessages) {
    this.ctx = ctx;
    this.RouteName = routeName;
    this.RouteIndex = routeIndex;
    this.CURRENT_ROUTE_PATH = routeUpOrDownPath;
    this.hasSpecialMessages = hasSpecialMessages;       
}
public String getName() { return RouteName; }
public int getIndex() { return RouteIndex; }

public String[] getStationsNames()
{       
    if(this.stationsList == null)
    {
        String file = this.CURRENT_ROUTE_PATH + "/" + CONSTANTS.SUBPATH_STATIONS + "/" + this.RouteIndex + ".txt";
        String[][] tempList = ResourceReader.GetValues(ctx, file, 2);
        this.stationsList = new Hashtable<String, String>(tempList.length);
        this.stationsNames = new String[tempList.length];
        for(int i=0;i<tempList.length;i++)
        {
            this.stationsList.put(tempList[i][0], tempList[i][1] );
            this.stationsNames[i] = tempList[i][0];
        }
        this.firstStation = this.stationsNames[0];
    }

    return stationsNames;
}

public String[] getTimings(String stationName)
{
    if(this.trainTimings == null)
    {
        String file = this.CURRENT_ROUTE_PATH + "/" + CONSTANTS.SUBPATH_TIMINGS + "/" + this.RouteIndex + ".txt";
        this.trainTimings = ResourceReader.GetLines(ctx, file);

        for(int i=0;i<this.trainTimings.length;i++)
        {
            this.trainTimings[i] = this.trainTimings[i].substring(0, 2) + ":" + this.trainTimings[i].substring(2, 4);
        }
    }

    int minutesFromOrigin =  
        Integer.parseInt(this.stationsList.get(stationName).toString())
        - Integer.parseInt(this.stationsList.get(this.firstStation).toString());

    String[] trainTimingsForStation = new String[this.trainTimings.length];
    for (int i = 0; i < trainTimingsForStation.length; i++) {
        trainTimingsForStation[i] = AddMinutes(this.trainTimings[i], minutesFromOrigin);
    }

    return trainTimingsForStation;
}

public void loadSpecialMessages()
{
    if(this.hasSpecialMessages == true && this.specialMessages == null)
    {
        this.specialMessages = new Hashtable<String, String>();
        String specialMessagesFilePath = this.CURRENT_ROUTE_PATH + "/" + CONSTANTS.SPECIALMESSAGES_FOLDER_NAME + "/" + this.RouteIndex + ".txt";

        String[][] tempSpecialMessages = ResourceReader.GetValues(ctx, specialMessagesFilePath, 2);
        for (int i = 0; i < tempSpecialMessages.length; i++)
        {
            tempSpecialMessages[i][1] = tempSpecialMessages[i][1].replaceAll("\\n", "\n");  //  StringFunctions.replace(tempSpecialMessages[i][1], "\\n", "\n");


            tempSpecialMessages[i][0] = tempSpecialMessages[i][0].substring(0, 2) + ":" + tempSpecialMessages[i][0].substring(2, 4);;

            this.specialMessages.put(tempSpecialMessages[i][0], tempSpecialMessages[i][1]);
        }
    }
}   

public boolean hasSpecialMessage(int trainIndex)
{
    if(this.hasSpecialMessages == true)
    {
        return this.specialMessages.containsKey(this.trainTimings[trainIndex - 1]);
    }
    else
        return false;
}


public String getSpecialMessage(int trainIndex)
{
    return this.specialMessages.get((this.trainTimings[trainIndex - 1]).toString()).toString();
}   

在实施Parcelable,我真搞不懂怎么加中实现功能的对象字段。

On implementing Parcelable, I can't make out how to add the object fields in implemented functions.

由于这么多的哈希表,字符串[],将实施Serialiazable更多preferred对于这种情况比Parcelable?如果加上序列化,然后还如何实现TS方法是一样的。

Due to so many HashTable, String[], would implementing Serialiazable more preferred for this case than Parcelable ? If add Serializable then also how to implement ts methods for the same.

编辑: 在上面的OBJ,我添加了一个方法:

In the above obj, I added a method :

    public Hashtable<String, String> getAllSpecialMessages() {
    return this.specialMessages;
}

我想只是为了通过这个哈希表从我的活动到另一个活动:

I am trying just to pass this HashTable from my Activity to another Activity :

intent.putExtra("specialMsgs", curTrainRoute.getAllSpecialMessages());

// OTHER ACTIVTY 
    Serializable data = sender.getSerializableExtra("specialMsgs");
    if (data != null) {
        spMsgs = new Hashtable<String, String>((HashMap<String, String>)data);
        Log.i(TAG, " GOT spMsgs : Len = " + spMsgs.size());
        if (spMsgs.size() > 0) {
            java.util.Enumeration<String> keys = spMsgs.keys(); 
            while(keys.hasMoreElements()) {
                Log.i(TAG, "SP= " + spMsgs.get(keys));
            }
        }
    }

在这里,我得到GOT spMsgs:长度= 4,但在登录SP =,我得到无限空的通过哈希表???我是什么人仍下落不明。

Here I get "GOT spMsgs : Len = 4. But in Log SP=, I get infinite null. Why enteries can't be found of passed Hashtable ??? What am I still missing ?

要寻找出一些指导,因为最近2天这个问题,但无法弄清楚什么&功放;如何做到与此对象。

Am looking out for some guidance for this issue since last 2 days, but couldn't figure out what & how to do with this object.

任何帮助是非常AP preciated。

Any help is highly appreciated.

推荐答案

终于可以通过Hasttable其他活动,并得到了它,因为它是。有了这个,我做其他活动SOEM workigns,但不是一个坏主意或大量的code去努力。于是,懂了。

Could finally pass the Hasttable to other Activity and got it as it is. With this, I got to do soem workigns in other Activity, but was not a bad idea or lots of code to work on. So, got it.

多谢小提琴手和放大器;彼得。

Thanks a lot fiddler & Peter.