我有一个FragmentActivity,它在第二个Tab上保存FragmentList . FragmentList实现了ListView和自定义Object的ArrayList .
然后,当用户想要构造新的列表项时,我会调用第二个活动;当用户在此次要活动中点击“Okay”时;它接受该活动的所有输入参数,并构造一个parcelable对象以传递回FragmentActivity(MainActivity) .
我的问题是:当我执行intent和startActivity时,我的主要活动的onNewIntent方法没有被调用 .
这是一些相关的代码:
我的Parcelable对象类:
package com.nanospark.upcdemo;
import android.os.Parcel;
import android.os.Parcelable;
public class listControlObject implements Parcelable {
private String name;
private int id;
private int tempType;// 0 for fahrenheit, 1 for celsius.
private int powerPercent;
private int freq;
private int temp;
private int cycleDateDay;
private int cycleDateMonth;
private int numberOfCycles;
private int cycleTimeHour;
private int cycleTimeMinute;
public listControlObject(String name, int id, int tempType,
int powerPercent, int freq, int temp, int cycleTimeHour,
int cycleTimeMinute, int cycleDateDay, int cycleDateMonth,
int numberOfCycles) {
this.id = id;
this.name = name;
this.cycleDateDay = cycleDateDay;
this.cycleDateMonth = cycleDateMonth;
this.cycleTimeHour = cycleTimeHour;
this.cycleTimeMinute = cycleTimeMinute;
this.freq = freq;
this.numberOfCycles = numberOfCycles;
this.powerPercent = powerPercent;
this.temp = temp;
this.tempType = tempType;
}
private listControlObject(Parcel in){
this.id = in.readInt();
this.name = in.readString();
this.cycleDateDay = in.readInt();
this.cycleDateMonth = in.readInt();
this.cycleTimeHour = in.readInt();
this.cycleTimeMinute = in.readInt();
this.freq = in.readInt();
this.numberOfCycles = in.readInt();
this.powerPercent = in.readInt();
this.temp = in.readInt();
this.tempType = in.readInt();
}
public int getCycleDateDay() {
return cycleDateDay;
}
public void setCycleDateDay(int cycleDateDay) {
this.cycleDateDay = cycleDateDay;
}
public int getCycleDateMonth() {
return cycleDateMonth;
}
public void setCycleDateMonth(int cycleDateMonth) {
this.cycleDateMonth = cycleDateMonth;
}
public int getCycleTimeHour() {
return cycleTimeHour;
}
public void setCycleTimeHour(int cycleTimeHour) {
this.cycleTimeHour = cycleTimeHour;
}
public int getCycleTimeMinute() {
return cycleTimeMinute;
}
public void setCycleTimeMinute(int cycleTimeMinute) {
this.cycleTimeMinute = cycleTimeMinute;
}
public int getNumberOfCycles() {
return numberOfCycles;
}
public void setNumberOfCycles(int numberOfCycles) {
this.numberOfCycles = numberOfCycles;
}
public int getTempType() {
return tempType;
}
public void setTempType(int tempType) {
this.tempType = tempType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPowerPercent() {
return powerPercent;
}
public void setPowerPercent(int powerPercent) {
this.powerPercent = powerPercent;
}
public int getFreq() {
return freq;
}
public void setFreq(int freq) {
this.freq = freq;
}
public int getTemp() {
return temp;
}
public void setTemp(int temp) {
this.temp = temp;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return this.name;
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(id);
parcel.writeString(name);
parcel.writeInt(cycleDateDay);
parcel.writeInt(cycleDateMonth);
parcel.writeInt(cycleTimeHour);
parcel.writeInt(cycleTimeMinute);
parcel.writeInt(freq);
parcel.writeInt(numberOfCycles);
parcel.writeInt(powerPercent);
parcel.writeInt(temp);
parcel.writeInt(tempType);
}
public static Creator<listControlObject> CREATOR = new Creator<listControlObject>() {
public listControlObject createFromParcel(Parcel parcel) {
return new listControlObject(parcel);
}
public listControlObject[] newArray(int size) {
return new listControlObject[size];
}
};
}
主要FragmentActivity类:
公共类MainActivity扩展FragmentActivity实现ActionBar.TabListener {String TAG;
HomeFragment homeFragment;
cycleviewfragment cyclefragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Set up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
homeFragment = new HomeFragment();
cyclefragment = new cycleviewfragment();
processNewIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
processNewIntent(intent);
}
private void processNewIntent(Intent intent) {
if (intent.hasExtra("custom_object")) {
cyclefragment.a1.add((listControlObject) intent.getParcelableExtra("custom object"));
cyclefragment.adapter.notifyDataSetChanged();
}
}
我的ListFragment类:
package com.nanospark.upcdemo;
import java.util.ArrayList;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class cycleviewfragment extends ListFragment {
View cycleviewfragment;
ListView cyclelist;
ArrayList<listControlObject> a1;
ArrayAdapter<listControlObject> adapter;
Button addButton;
Context context;
public View onCreateView(LayoutInflater viewInflation, ViewGroup container,
Bundle SavedInstantState) {
cycleviewfragment = viewInflation.inflate(
R.layout.cycleviewfragment_page, container, false);
context = getActivity().getApplicationContext();
a1 = new ArrayList<listControlObject>();
adapter = new ArrayAdapter<listControlObject>(getActivity()
.getBaseContext(), android.R.layout.simple_list_item_1, a1);
this.setListAdapter(adapter);
addButton = (Button) cycleviewfragment.findViewById(R.id.addbutton);
addButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent myIntent = new Intent(getActivity(),
listaddactivity.class);
myIntent.putExtra("Array", a1); // Optional parameters
getActivity().startActivity(myIntent);
}
});
return cycleviewfragment;
}
public ListView getCyclelist() {
return cyclelist;
}
public void setCyclelist(ListView cyclelist) {
this.cyclelist = cyclelist;
}
public ArrayList<listControlObject> getA1() {
return a1;
}
public void setA1(ArrayList<listControlObject> a1) {
this.a1 = a1;
}
}
添加调试日志后
private void processNewIntent(Intent intent) {
if (intent.hasExtra("custom_object")) {
cyclefragment.a1.add((listControlObject) intent.getParcelableExtra("custom object"));
cyclefragment.adapter.notifyDataSetChanged();
if(!intent.getParcelableArrayExtra("custom object").equals(null)){
Log.d("TEST MESSAGE", "The intent parcelables are not null");
}
}
}
The log message never appears. So I'm assuming that my getParcelableArrayExtra is null? Edit: After adding several logs it appears my MainActivity's onNewIntent(Intent intent) and processNewIntent(Intent intent) are never being called; why would this be? Especially if I explicitly call it in the onCreate method?
编辑二:
研究显示发布清单可能有所帮助,所以这里是:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.nanospark.upcdemo"
android:versionCode="1"
android:versionName="1.0"
>
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".listaddactivity"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我甚至尝试将android:launchMode =“singleTop”添加到我的清单活动中,但它仍然没有按照我的日志调用onNewIntent方法 .
编辑:
我可以显式添加一个listControlObject然后出现我的ListView;但是仍然不能用对象的parcelable做onNewIntent方法 .
解决方案:
问题解决了 - 我需要做的就是修复我在这里错误实现的密钥:
if (intent.hasExtra("custom_object"))
应该:
if (intent.hasExtra("custom object"))