我正在尝试创建一个基本的“找到最近的...”应用程序,作为学习练习。
我有3个活动:
1. 主要活动,用户在其中输入自己的地址,通过意图将对象数组传递给列表活动。 2. 列表活动,显示最近的10个地点。当选择一个项目时,它通过意图将对象传递给详细信息活动。 3. 详细信息活动,显示所选位置的详细信息。
我已经完成了大部分工作,但是我注意到了一个小问题,即返回按钮(在我的手机屏幕底部)和上按钮(在操作栏上)之间的差异。经过研究,两者在这种情况下似乎应该表现相同。当点击返回按钮时,一切都按预期工作,并且我们仍然看到相同的列表。然而,当点击上按钮时,它似乎以不同的方式启动/恢复列表活动,并且列表中的数据已经消失了。
是否有人能够解释一下为什么会发生这种情况以及如何防止它发生?
以下是我的代码:(欢迎对我的Android / Java技术提出任何批评!)
MainActivity.java
我有3个活动:
1. 主要活动,用户在其中输入自己的地址,通过意图将对象数组传递给列表活动。 2. 列表活动,显示最近的10个地点。当选择一个项目时,它通过意图将对象传递给详细信息活动。 3. 详细信息活动,显示所选位置的详细信息。
我已经完成了大部分工作,但是我注意到了一个小问题,即返回按钮(在我的手机屏幕底部)和上按钮(在操作栏上)之间的差异。经过研究,两者在这种情况下似乎应该表现相同。当点击返回按钮时,一切都按预期工作,并且我们仍然看到相同的列表。然而,当点击上按钮时,它似乎以不同的方式启动/恢复列表活动,并且列表中的数据已经消失了。
是否有人能够解释一下为什么会发生这种情况以及如何防止它发生?
以下是我的代码:(欢迎对我的Android / Java技术提出任何批评!)
MainActivity.java
public class MainActivity extends Activity {
public final static String TRACKS = "com.example.firstapp.TRACKS";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/** Called when the user clicks the 'Search' button */
public void search(View view) {
// Get Address Text
// EditText editText = (EditText) findViewById(R.id.edit_address);
// String address = editText.getText().toString();
// Get tracks near to address
Track[] trackArray = new Track[20];
for(int i=0; i < trackArray.length; i++) {
trackArray[i] = new Track("Track " + i, "Address" + i, (float) Math.random()*10);
}
// Fire intent to show results
Intent intent = new Intent(this, TrackListActivity.class);
intent.putExtra(TRACKS, trackArray);
startActivity(intent);
}
}
TrackListActivity.java
public class TrackListActivity extends ListActivity {
public final static String TRACK = "com.mycroft.runtrackdir.TRACK";
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if (intent.hasExtra(MainActivity.TRACKS)) {
Parcelable[] tempTrackArray = intent.getParcelableArrayExtra(MainActivity.TRACKS);
// Cast Parcelable to Track
Track[] trackArray = new Track[tempTrackArray.length];
for(int i=0; i < trackArray.length; i++) {
trackArray[i] = (Track) tempTrackArray[i];
}
ArrayAdapter<Track> arrayAdapter = new ArrayAdapter<Track>(this, android.R.layout.simple_list_item_1, trackArray);
setListAdapter(arrayAdapter);
}
}
@Override
protected void onListItemClick (ListView l, View v, int position, long id) {
Track clickedTrack = (Track) l.getItemAtPosition(position);
// Fire intent to show detail
Intent intent = new Intent(this, TrackDetailActivity.class);
intent.putExtra(TRACK, clickedTrack);
startActivity(intent);
}
}
TrackDetailActivity.java
public class TrackDetailActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
Track track = intent.getParcelableExtra(TrackListActivity.TRACK);
setContentView(R.layout.activity_track_detail);
TextView track_name = (TextView) findViewById(R.id.track_name);
TextView track_address = (TextView) findViewById(R.id.track_address);
TextView track_distance = (TextView) findViewById(R.id.track_distance);
track_name.setText(track.name);
track_address.setText(track.address);
track_distance.setText(track.distance.toString());
}
}
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.firstapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.firstapp.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.firstapp.TrackListActivity"
android:label="@string/title_activity_track_list"
android:parentActivityName="com.example.firstapp.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.firstapp.MainActivity" />
</activity>
<activity
android:name="com.example.firstapp.TrackDetailActivity"
android:label="@string/title_activity_track_detail"
android:parentActivityName="com.example.firstapp.TrackListActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.firstapp.TrackListActivity" />
</activity>
</application>
</manifest>
onCreate
和onResume
来验证我的诊断。 - Salman KhakwanionResume
,但是当按下向上按钮时,会调用onCreate
和onResume
,导致了我的当前情况。您编辑后的答案似乎含糊不清,首先建议使用Shared Pref's,然后提到这是不好的做法。难道没有更好的解决方案吗?我发现改变主页按钮的默认行为可以解决我的问题,通过在详细活动中按下主页时调用finish
。这是不好的做法还是可行的解决方案? - WMycroft