多重意图过滤到多个活动

时间:2016-03-01 18:53:47

标签: java android android-intent android-activity android-manifest

我有两个与两个按钮相关的活动

\footnote

<?xml version="1.0" encoding="utf-8"?>

MainActivity代码

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"

    android:supportsRtl="true"
    android:theme="@style/AppTheme">





    <activity

        android:name=".Subactivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar"
        android:taskAffinity="com.example.start_cs.sub">
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>

    <activity
        android:label="@string/app_name"
        android:name=".sub"

        >
    </activity>

    <activity

        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar" android:taskAffinity="com.example.start_cs.main"
        >

        <intent-filter>

            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>


    </activity>


    <activity
        android:label="@string/app_name"
        android:name=".main"

        >
    </activity>


</application>

布局代码

package com.example.start_cs.myapp;




Button button;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_main);
    addListenerOnButton();
}

public void addListenerOnButton() {

    final Context context = this;

    button = (Button) findViewById(R.id.main_text_view);

    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            Intent intent = new Intent(context, main.class);
            startActivity(intent);

        }

    });

}

在这种情况下

子活动按钮打开子

但MainActivity按钮未打开主

但如果我将MainActivity置于Subactivity以上

子活动按钮未打开子

但是MainActivity按钮打开了主要

1 个答案:

答案 0 :(得分:1)

好的,根据你对我评论的回答,我想我可以说的是你需要按照如何为Android创建应用程序的教程。互联网上有很好的教程。

您有两个活动,因此您应该有两个布局文件。你只发了一个。

您还应该有两个源文件,每个活动一个。你只发了一个。

您希望在代码中引用的布局中的每个元素都需要一个ID。您的代码引用R.id.main_text_view,但您的布局文件中没有此类ID。我甚至编译你的代码感到惊讶。

但是,要回答您的具体问题,您需要的是以下内容:

1)清单文件中的<name>标记必须与每个活动的java类源文件的名称相匹配。因此,您的活动类文件似乎被称为&#34; MainActivity&#34;和&#34;子活动&#34;根据你的清单文件。但是,请参阅下面对onClickListener代码的评论。

此外,您的清单表明您的两个活动都是&#34; LAUNCHER&#34;活动。您只需要该标记用于您希望能够从Android应用程序启动器启动的活动(即手机上安装的所有应用程序的列表)。看起来你只想在你的主要活动中使用它,但如果你愿意,你可以指定多个。

2)你的活动是彼此的双重关系(即它们听起来像是完全相同的东西 - 每个都有一个按钮启动另一个)所以代码将非常相似。您的MainActivity代码应如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_main);
    addListenerOnButton();
}

public void addListenerOnButton() {

    final Context context = this;

    button = (Button) findViewById(R.id.main_text_view);  //<-- This tries to find a button in this activity (using the activity's layout file that was used in the call to setContentView() in onCreate().  However, the id you specify doesn't exist in your layout file.  This should either not compile or return null.

//This is fine.
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            Intent intent = new Intent(context, main.class);  //<--"main.class" doesn't match either of the activity names declared in your manifest.  It should match one of the names declared in the <name> tag of one of your <activity> tags.
            startActivity(intent);

        }

    });

}

您的布局文件需要包含希望使用findViewById()查找的按钮的ID。修改您的布局文件如下(并为每个活动创建一个 - 尽管从技术上讲,您可以为每个活动引用相同的布局。但是现在,从概念上讲,单独的文件更容易。)

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/main"
android:background="@drawable/main"
android:layout_centerHorizontal="true"
android:id="@+id/main_text_view"    <!--  Here is the line that identifies the button for your app.  The format is "@+id/some_name", and is reference as "R.id.some_name" in your code. -->


android:layout_marginTop="17dp"


/>

现在您必须在子活动代码中执行相同的操作,但是onClickListener将调用主活动而不是您的子活动。因此onClickListener代码对于您的MainActivity(启动您的子活动)看起来像这样:

button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            Intent intent = new Intent(context, Subactivity.class);
            startActivity(intent);

        }

    });

并在您的子活动(启动您的主要活动)

中这样
button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            Intent intent = new Intent(context, MainActivity.class);
            startActivity(intent);

        }

    });