Android中的向上和向后按钮之间的差异

时间:2013-08-08 20:52:41

标签: android

我正在尝试创建一个基本的“查找我最近的......”应用程序作为学习练习。

我有3项活动:

  1. 主要活动,用户输入他的地址,这通过了 通过intent的列表活动的对象数组。
  2. 列表活动,显示最近的10个地方。选择项目时,会通过意图将对象传递给详细活动。
  3. 详细活动,显示所选地点的详细信息。
  4. 我有大部分工作,但是我注意到一个小问题,与后退按钮(在我的手机屏幕底部)和向上按钮(在操作栏上)产生差异。在研究了两者之间的差异之后,看起来它们在这种情况下应该表现相同。当按下后退按钮时,一切都按预期工作,我们仍然看到相同的列表。但是,当按下向上按钮时,它似乎以不同的方式启动/恢复列表活动,并且列表中的数据已消失。

    有人能够向我解释为什么会发生这种情况以及如何预防吗?

    我的代码如下:(对我的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>
    

3 个答案:

答案 0 :(得分:4)

我认为您应该修改Manifest.xml文件并告诉Manifest file您的活动之间的关系。这应该可以解决问题。

例如:

<application ... >
...
<!-- The main/home activity (has no parent activity) -->
<activity
    android:name="com.example.myfirstapp.MainActivity" ...>
    ...
</activity>
<!-- A child of the main activity -->
<activity
    android:name="com.example.myfirstapp.DisplayMessageActivity"
    android:label="@string/title_activity_display_message"
    android:parentActivityName="com.example.myfirstapp.MainActivity" >
    <!-- Parent activity meta-data to support API level 7+ -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.myfirstapp.MainActivity" />
</activity>

您还可以查看this文档。

修改:
如果在某些活动中收到空Intent,也可以使用Data Persistence。 对于Android中的数据持久性,您可以使用Shared PreferencesSQLite DatabaseSerialization

在学习Android开发时,您只需将trackArray值放在应用程序的共享首选项中,同时从主活动启动列表活动,并从列表活动中的共享首选项加载trackArray的数据在onResume中填写onCreate。 这样,操作栏的向上按钮不会使ListView Activity的数据消失。

P.S:共享pref的实际目的是存储大小较小且偶尔更改的值,例如设置特定应用程序的数据。因此,请不要滥用它。

答案 1 :(得分:1)

  • 向上按钮和后退按钮之间的区别。

后退按钮 - 后退按钮将您带到之前活动的最后一个活动。

向上按钮 - 向上按钮以层次结构或祖先方式向上提升一级。无论您最后一次活动活动是什么,您都将被重定向到您在清单中设置的父活动。

  

虽然Back and Up Button几乎在许多方面做同样的事情   条件,但他们在幕后做了不同的步骤。

答案 2 :(得分:0)

在清单文件中的TrackListActivity中添加launchMode =“ singleTop”

<activity
        android:name="com.example.firstapp.TrackListActivity"
        android:label="@string/title_activity_track_list"
        android:launchMode="singleTop"
        android:parentActivityName="com.example.firstapp.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.firstapp.MainActivity" />
</activity>

如果您不希望在按下向上按钮时杀死并重新启动活动,则需要使用launchMode =“ singleTop”。