【问题标题】:Android: ActionBar always opens SettingsActivityAndroid:ActionBar 总是打开 SettingsActivity
【发布时间】:2013-06-06 20:18:10
【问题描述】:

同时我不知道为什么我的导航不起作用。 在我的主菜单中有 2 个图标可以切换到不同的活动:搜索和设置。 但是每次我点击搜索时,settingsActivity 都会打开。我检查了搜索的 ID,在 Manifest 中输入了活动 ...

如果我向视图添加一个附加按钮并尝试启动 searchActivity,一切正常。但即使我注释掉 R.id.settingsMenu-thing 案例,如果我点击搜索符号,settingsActivity 也会打开......有什么想法吗? :(提前谢谢!

MainActivity.java

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.mainmenu, menu);
    return super.onCreateOptionsMenu(menu);
     }

public boolean onOptionsItemSelected(MenuItem item){
        Intent intent = null;

        switch(item.getItemId()){

        case android.R.id.home:
            intent = new Intent(this,MainActivity.class);
            startActivity(intent);
            break;

        case R.id.searchMenu:
            intent = new Intent(this,SearchActivity.class);
            startActivity(intent);
            break;

        case R.id.settingsMenu:
            intent = new Intent(this,SettingsActivity.class);
            startActivity(intent);
            break;

        default:
            return super.onOptionsItemSelected(item);
        }
        return true;
    }

Manifest.xml

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.anothertest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:debuggable="true">
        <activity
            android:name="android.app.ui.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="android.app.ui.SearchActivity" android:label="@string/search"></activity>
        <activity android:name="android.app.ui.SettingsActivity" android:label="@string/settings"></activity>
        <activity android:name="android.app.ui.NoArticleInListActivity"></activity>
    </application>

</manifest>

mainmenu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item 
        android:id="@+id/searchMenu"
        android:title="@string/search"
        android:icon="@android:drawable/ic_menu_search"
        android:orderInCategory="1"
        android:showAsAction="always">
        </item>

    <item
        android:id="@+id/settingsMenu"
        android:orderInCategory="2"
        android:showAsAction="always"
        android:title="@string/action_settings"
        android:icon="@android:drawable/ic_menu_preferences">
        </item>

</menu>

编辑

设置片段

public class SettingsFragment extends PreferenceFragment{

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }
}

设置活动

public class SettingsActivity extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
    }

    protected void onStart(){
        super.onStart();
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    public boolean onOptionsItemSelected(MenuItem item){
        switch(item.getItemId()){
        case android.R.id.home:
            Intent intent = new Intent(this,MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory 
        android:title="@string/settingsSummaryCalendar">
        android:key="pref_calendar_settings">
        <CheckBoxPreference
            android:key="prefArticleAsCalendarEntry"
            android:summary="@string/settingsSummaryCalendarEntry"
            android:title="@string/settingCreateEntryForEach"
            android:defaultValue="true"/>
        <CheckBoxPreference 
            android:key="prefCreateOwnCalendar"
            android:summary="@string/settingsSummaryCalendar"
            android:title="@string/settingCreateOwnCalendar"
            android:defaultValue="true"/>
    </PreferenceCategory>

    <PreferenceCategory 
        android:title="@string/settingsSummaryNotification">
        android:key="pref_notification_settings">
        <CheckBoxPreference
            android:key="prefNotification"
            android:summary="@string/settingsSummaryNotification"
            android:title="@string/settingsNotification"
            android:defaultValue="true" >
        </CheckBoxPreference>
        <ListPreference 
            android:key="prefNotificationTime"
            android:entries="@array/notificationTime"
            android:entryValues="@array/notificationTimeValues"
            android:summary="@string/settingsSummaryNotificationTime"
            android:title="@string/settingsNotificationTime"
            android:defaultValue="@string/settingsNotificationTime_default" 
            android:dependency="prefNotification">
        </ListPreference>
    </PreferenceCategory>
</PreferenceScreen>

【问题讨论】:

  • 一个建议:在 break 的每个子句中添加 Log.debug 语句,以便您知道执行代码的哪个分支。此外,在此处发布 logcat 可能会有所帮助。但是,是的,乍一看,似乎还可以
  • 添加 Log.d(Tag, text) 后,控制台中会显示与 System.out.println 相同的数字/ID。但是当我试图启动搜索活动时,在控制台中显示了两次 ID ......似乎调试命令被调用了两次?!但为什么?即使将 switch 命令更改为简单的 if-else,settingsActivity 也总是被调用 :(
  • 还有其他想法吗?我不明白... :(

标签: android android-intent android-activity


【解决方案1】:

唯一的可能是 Eclipse 弄乱了元素的 ID。这发生在我更新了 SDK 而不是 ADT 之后。所以,这里有一个建议:

1- 尝试清理项目。在 Eclipse 中,它位于 Project-> Clean 下。使用调试语句,检查你点击的元素的id(R.id.settings,R.id.search)是否和R.java中定义的一样

2- 如果这不起作用,请将 SDK 更新到最新版本(截至本文发布时为 22)。另外,更新 ADT。检查此答案以了解如何执行此操作:How can I update my ADT in Eclipse?

3- 最后的手段:删除项目,然后重新导入。

【讨论】:

  • 不幸的是,这也没有帮助......如果我试图重新导入项目,我会收到项目描述无效的消息。所以我创建了一个新项目并使用了相同的代码等-->仍然是同样的错误。因此,在我看来,错误必须与设置有关。我将在我的第一篇文章中添加它们。也许你在这里发现了错误......因为同时我很沮丧:(
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 2023-03-05
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 2018-01-11
相关资源
最近更新 更多