2016-09-01 62 views
0

build.gradle(Module:app)中添加productFlavors之前,Toolbar中的返回按钮起作用。 但是,一旦我将productFlavors添加到build.gradle(Module:app)Build >> Generate Signed APK...,返回按钮将变为无效。添加productFlavors后,Android工具栏返回按钮不起作用

的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    package="com.comp548.note"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" 
     tools:ignore="AllowBackup,GoogleAppIndexingWarning"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".NoteEditActivity"> 
      <meta-data android:name="android.support.PARENT_ACTIVITY" 
       android:value=".MainActivity"/> 
     </activity> 
    </application> 

</manifest> 

的build.gradle(模块:APP)加入productFlavors后:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 24 
    buildToolsVersion "24.0.1" 

    defaultConfig { 
     applicationId "com.comp548.note" 
     minSdkVersion 19 
     targetSdkVersion 24 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    productFlavors { 
     free { 
      applicationId "com.comp548.note.free" 
      versionName "1.0-free" 
     } 
     paid { 
      applicationId "com.comp548.note.paid" 
      versionName "1.0-paid" 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:24.2.0' 
    compile 'com.android.support:design:24.2.0' 
} 

toolbar.xml在layout

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:background="@color/colorPrimary" 
    app:theme="@style/ThemeOverlay.AppCompat.Dark" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    tools:ignore="Overdraw"> 

</android.support.v7.widget.Toolbar> 

activity_note_edit.xml在layout

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.comp548.note.NoteEditActivity"> 

    <include layout="@layout/toolbar" 
     android:id="@+id/note_edit_toolbar" /> 

    <fragment 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_margin="@dimen/fragment_margin" 
     android:name="com.comp548.note.NoteEditFragment" 
     android:id="@+id/fNoteEdit" 
     android:layout_centerHorizontal="true" 
     tools:layout="@layout/fragment_note_edit" 
     android:layout_below="@id/note_edit_toolbar"/> 
</RelativeLayout> 

MainActivity.java:

package com.comp548.note; 

import android.content.Intent; 
import android.support.design.widget.FloatingActionButton; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 

public class MainActivity extends AppCompatActivity { 

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

     Toolbar toolbar = (Toolbar)findViewById(R.id.note_list_toolbar); 
     // Set the Toolbar to act as the ActionBar for this Activity window 
     setSupportActionBar(toolbar); 
     if(getSupportActionBar() != null) { 
      getSupportActionBar().setTitle(R.string.toolbar_title); 
     } 
     getSupportActionBar().setIcon(R.drawable.ic_toolbar); 

     FloatingActionButton fabAdd = (FloatingActionButton)findViewById(R.id.fabAdd); 
     fabAdd.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(MainActivity.this, NoteEditActivity.class); 
       startActivity(intent); 
      } 
     }); 
    } 

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()){ 
      case R.id.menu_exit: 
       finish(); 
       break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

NoteEditActivity.java:

package com.comp548.note; 

import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 

public class NoteEditActivity extends AppCompatActivity { 

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

     Toolbar toolbar = (Toolbar)findViewById(R.id.note_edit_toolbar); 
     // Set the Toolbar to act as the ActionBar for this Activity window 
     setSupportActionBar(toolbar); 
     // Enable return button 
     if(getSupportActionBar() != null) { 
      getSupportActionBar().setHomeButtonEnabled(true); 
     } 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     Intent intent = getIntent(); 
     NoteEntity noteEntity = (NoteEntity) intent.getSerializableExtra("noteEntity"); 
     // Set values for Views in NoteEditFragment 
     if (noteEntity != null) { 
      NoteEditFragment noteEditFragment = (NoteEditFragment)getSupportFragmentManager().findFragmentById(R.id.fNoteEdit); 
      noteEditFragment.setValues(noteEntity); 
     } 
    } 
} 

应用截图: enter image description here

删除build.gradle(Module:app)productFlavors返回按钮再次工作后。

为什么Toolbar上的返回按钮在添加productFlavors后不起作用。

如何修复它,如果我还想添加productFlavors

+0

发布您的'onOptionsItemSelected()' –

+0

我添加了'MainActivity.java'其中包含'onOptionsItemSelected()'。 'onOptionsItemSelected()'当前只能处理'exit'函数。还添加了三个屏幕截图。 –

回答

1

好你NoteEditActivity添加回调方法onOptionsItemSelected(MenuItem item)并执行以下操作:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()){ 
     case android.R.id.home: 
      onBackPressed(); 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 

应该解决您的问题,使工具栏后退按钮执行后退按钮的作用。希望这可以帮助。

+0

谢谢,它的工作:) –

+0

@ J.W好请标记为解决方案,以便问题反映如此。我很高兴它为你工作。 – KudzieChase

0

原因:你为每种口味都加上不同的applicationId。 在清单中,您为父活动设置了元数据,但是在建筑物风味期间,所有包都自动移动到包com.comp548.note.freecom.comp548.note.paid。您的元数据指向com.comp548.note.MainActivity,但您的实际活动位于com.comp548.note.paid | free.MainActivity下。

解决方案:

  1. 创建用于元数据的每个点味道来纠正包单独体现。
  2. 在运行时处理它,如KudzieChase所述。
+0

谢谢,解决方案2工作。但我不太明白解决方案1?你有我可以学习的示例链接吗? –

+0

@ J.W请看看https://developer.android.com/studio/build/build-variants.html#sourcesets – Mike

+0

谢谢。消化这些内容需要一些时间:) –

相关问题