【问题标题】:Re-inflating the same menu across all activities in Android Studio在 Android Studio 中的所有活动中重新膨胀相同的菜单
【发布时间】:2021-07-17 20:45:05
【问题描述】:

我想要一些关于如何在您的活动中正确扩充工具栏的建议,以便来自任何活动的任何输入都使用在 menu.xml 资源中定义的相同菜单。

下面的代码有以下内容:

  1. MainActivityScreen0
  2. MainActivityScreen0 的布局
  3. menu.xml

就目前而言,第一个活动的菜单膨胀发生了,工作正常。当它进入下一个屏幕 (Screen0) 时,我在Screen0 的布局中再次定义工具栏,但使用android:id="@id/my_toolbar_initial_screen" 而不是android:id="@+id/my_toolbar_initial_screen",就像在MainActivitylayout 中一样。

我的问题是,当我按下Screen0 布局上的静音按钮时,它会在Screen0 中启动另一个音频实例。我需要将两个屏幕上的两个工具栏链接在一起,因此如果用户在Screen0 的布局上按下静音,它会理解它与MainActivity 布局中的同一菜单交互。

这样做的正确方法是什么?

清单:

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.finalProject">
    <activity android:name=".Screen0"
        android:parentActivityName=".MainActivity"
        android:theme="@style/Theme.finalProject">
    </activity>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

MainActivity.java

public class MainActivity extends AppCompatActivity {

MediaPlayer gMusic;
MediaPlayer gMusicBattleSong;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load initial screen
    setContentView(R.layout.activity_main);

    // Set a tool bar using androidx library (more updated version of zybooks example)
    Toolbar myToolBar = findViewById(R.id.my_toolbar_initial_screen);
    setSupportActionBar(myToolBar);

    // gMusic is a global MediaPlayer type
    gMusic = new MediaPlayer();

    // loading an mp3 into the gMusic object
    gMusic = MediaPlayer.create(MainActivity.this, R.raw.battle_theme);

}

Screen0.java

public class Screen0 extends MainActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    setContentView(R.layout.screen0);

    Toolbar myToolBar = findViewById(R.id.my_toolbar_initial_screen);
    setSupportActionBar(myToolBar);

    getMenuInflater().inflate(R.menu.menu, menu);
}

activty_main.xml 布局

   <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:actionBarNavMode="standard"
    >
<androidx.appcompat.widget.Toolbar

    android:id="@+id/my_toolbar_initial_screen"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/Sapphire"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/imageView"
    app:layout_constraintVertical_bias="0.0"

    />

Screen0.xml 布局

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Screen0">

<androidx.appcompat.widget.Toolbar
    android:id="@id/my_toolbar_initial_screen"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/Sapphire"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/imageView2"
    app:layout_constraintVertical_bias="0.0" />

menu.xml

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



<!-- Mute the music  -->
<item android:id="@+id/mute_menu_item"
    android:title="@string/mute_music"
    app:showAsAction="always"
    android:onClick="muteMusic"
    />


<!-- Restart menu item -->
<item
    android:id="@+id/restart_menu_item"
    android:icon="@drawable/light_bulb"
    android:title="@string/restart"
    app:showAsAction="never"
    android:onClick="restartStory"
    />

【问题讨论】:

  • 请发布您正在尝试的实际代码,并解释您期望什么以及什么不起作用。对一般问题的描述是不充分且含糊的。请咨询stackoverflow.com/help/how-to-ask 寻求帮助。

标签: android android-studio android-layout


【解决方案1】:

不过现在,当在下一个布局屏幕上按下静音按钮时,它会在已经播放的音频之上播放另一个音频实例。

您的问题不是重复的工具栏 - 您的问题是播放多个音频流。

我不知道你的应用程序的架构是什么样的,或者如何在 Android 上处理音频,但一般来说,你应该有 一个 句柄来处理你可以播放的当前音频流/暂停/停止/静音/随便。这可以作为单例或服务或其他方式维护。然后,每个工具栏将与 唯一 用于音频流的控制器进行交互。

【讨论】:

  • 对!单手柄部分是我想要弄清楚的。我可以在每个布局中复制相同的工具栏,或者使用指向每个菜单项的单个句柄的不同工具栏。无论哪种方式都有效,我只是不确定如何去做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多