it-swarm.com.ru

Android - кнопка «Назад» в строке заголовка

Во многих приложениях ("Календарь", "Диск", "Play Маркет"), когда вы нажимаете кнопку и вводите новое действие, значок в строке заголовка превращается в кнопку "Назад", но для приложения, которое я создаю, он этого не делает. Как заставить этот значок вернуть вас на предыдущий экран?

89
Drew

Есть два простых шага для создания кнопки "Назад" в строке заголовка:

Во-первых, сделайте значок приложения кликабельным, используя следующий код в упражнении, в строке заголовка которого вы хотите добавить кнопку "Назад":

ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

После добавления вышеуказанного кода слева от значка приложения появится стрелка назад.

enter image description here

Во-вторых, после того, как вы сделали вышеупомянутое, вам все еще нужно создать код, который будет использовать преимущество нажатия кнопки. Для этого имейте в виду, что когда вы действительно нажимаете на значок приложения, вызывается метод onOptionsItemSelected. Поэтому, чтобы вернуться к предыдущему действию, добавьте этот метод в свое действие и вставьте в него код Intent, который вернет вас к предыдущему действию. Например, допустим, что действие, к которому вы пытаетесь вернуться , называется MyActivity. Чтобы вернуться к этому, напишите метод следующим образом:

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

Это оно!

(В API разработчиков [Android, он рекомендует возиться с манифестом и добавлять такие вещи, как Android:parentActivityName. Но это, похоже, не работает для меня. Вышеприведенное проще и надежнее.)

<meta-data
      Android:name="Android.support.PARENT_ACTIVITY"
      Android:value=".MainActivity" />

И в вашей деятельности

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
125
Luke F.

используйте этот код

 @Override
 public void onCreate(Bundle savedInstanceState) {
    ...
   getActionBar().setDisplayHomeAsUpEnabled(true);
 } 

после этого напишите этот код в методе onOptionsItemSelected

  int id = item.getItemId();

     if (id==Android.R.id.home) {
        finish();
    }
53
anupam sharma

Мне наконец удалось правильно добавить кнопку назад на панель действий/панель инструментов

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}  

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case Android.R.id.home:
            finish();
            return true;
    }

    return super.onOptionsItemSelected(item);
}

public boolean onCreateOptionsMenu(Menu menu) {
    return true;
}
35
Lucy Fair

1.- Добавьте действие в AndroidManifest.xml и обязательно предоставьте метаданные:

<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 4.0 and lower -->
    <meta-data
        Android:name="Android.support.PARENT_ACTIVITY"
        Android:value="com.example.myfirstapp.MainActivity" />
</activity>

2.- Добавьте следующий код в метод onCreate действия:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
} 

3.- Переопределите onOptionsItemSelected и используйте статический метод NavUtils.navigateUpFromSameTask () для навигации по стеку.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case Android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

Однако использование navigateUpFromSameTask () подходит только в том случае, если ваше приложение является владельцем текущей задачи (то есть пользователь начал эту задачу из вашего приложения). Если это не так, и ваша деятельность была начата в задаче, которая принадлежит другому приложению, то при навигации вверх должно появиться новое задание, которое принадлежит вашему приложению, что требует создания нового резервного стека.

16
spacebiker

Если ваша деятельность расширяется

public class YourActivity extends Activity {

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

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}

Если ваше действие расширяет AppCompatActivity

public class YourActivity extends AppCompatActivity {

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

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

Больше нечего делать , смотрите Добавить действие

[ДОПОЛНИТЕЛЬНО] Чтобы явно определить родительскую активность, измените ваш Manifest.xml следующим образом:

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        Android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        Android:name="com.example.myfirstapp.YourActivity "
        Android:label="@string/title_activity_display_message"
        Android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

Смотрите укажите родительскую активность

9
tot

в первую очередь в функцию onCreate добавьте следующую строку

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

и затем добавьте следующую функцию в коде:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case Android.R.id.home:
                finish();
                return true;
        }

        return super.onOptionsItemSelected(item);
    }
5
M Anees

Самый простой способ и лучшие практики, как объясняет Google здесь :

1. Добавьте родителя для вашего childActivity в AndroidManifest.xml:

<activity 
        Android:name=".ChildActivity"
        Android:parentActivityName=".ParentActivity" >
</activity>

2. Активируйте кнопку "Назад" в вашем ребенке.

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

Работал для меня, я надеюсь, что это работает и для вас.

5
luke8800gts

Если вы используете новую библиотеку поддержки для 5.1 в Android studio, вы можете использовать ее в AppCompatActivity.

 ActionBar actionBar = getSupportActionBar();
 actionBar.setHomeButtonEnabled(true);
 actionBar.setDisplayHomeAsUpEnabled(true);
 actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
 actionBar.setDisplayShowHomeEnabled(true);

веселит.

4
ralphgabb

сначала нужно написать этот код

@Override
    protected void onCreate(Bundle savedInstanceState) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

Затем добавьте эту строку в манифест

 <activity Android:name=".MainActivity"
            Android:parentActivityName=".PreviousActivity"></activity>

Я думаю, что это будет работать

3
Shahriar Ahmad

Если ваша деятельность расширяется AppCompatActivity, вам нужно переопределить метод onSupportNavigateUp() следующим образом:

public class SecondActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_second);
       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
       getSupportActionBar().setHomeButtonEnabled(true);
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       ...
   }

   @Override
   public void onBackPressed() {
       super.onBackPressed();
       this.finish();
   }

   @Override
   public boolean onSupportNavigateUp() {
       onBackPressed();
       return true;
   }
}

Обработайте свою логику в своем методе onBackPressed() и просто вызовите этот метод в onSupportNavigateUp(), чтобы кнопка "Назад" на телефоне и стрелка на панели инструментов делали одно и то же.

3
Ruzin

Облегченная версия без использования ActionBarActivity, которая все еще имеет то же поведение здесь:

public class ToolbarConfigurer implements View.OnClickListener {
    private Activity activity;

    public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
        toolbar.setTitle((this.activity = activity).getTitle());
        if (!displayHomeAsUpEnabled) return;
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        toolbar.setNavigationOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        NavUtils.navigateUpFromSameTask(activity);
    }
}

Использование: Поместите new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true); в onCreate.

2
Mygod

Вам необходимо добавить указанный ниже код в файл манифеста. Найдите действие, в которое вы хотите добавить функцию стрелки назад. Если вы найдете один, то хорошо или создать деятельность

<activity Android:name=".SearchActivity">

</activity>

Затем добавьте следующие три строки кода между ними.

<meta-data
Android:name="Android.support.PARENT_ACTIVITY"
Android:value="com.example.raqib.instadate.MainActivity" />

И не забудьте добавить этот фрагмент кода в onCreate (); метод вашей конкретной деятельности, в котором вам нужно стрелка назад.

        Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
    setSupportActionBar(toolbar);
    try{
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }catch(NullPointerException e){
       Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
    }

Вот как я решил проблему. Благодарю.

1
RaQib

Мне нужно было смешать несколько ответов, чтобы получить правильный ответ для меня, потому что в моем приложении есть 3 действия, которые могут быть возвращены в любое время. Деятельность 1> Деятельность 2> Деятельность 3. Когда я что-то делал в своей деятельности 3, кнопка "Назад" правильно выполняла задание "Деятельность 2". Однако из Activity2, используя finish(), он возвращался к Activity3, а не к Activity1. И я расширяю AppCompatActivity. Итак, мое решение было:

public class Activity2 extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...

            getSupportActionBar().setHomeButtonEnabled(true);
        }
    }

на AndroidManifest.xml:

<activity Android:name=".activities.Activity2"
           Android:parentActivityName="com.example.appname.activities.Activity1">
            <meta-data
                Android:name="Android.support.PARENT_ACTIVITY"
                Android:value="com.example.appname.activities.Activity1" />
        </activity>

и, наконец, кнопка действия в моем меню (панель действий):

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            ...

            case Android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;

        }

        return super.onOptionsItemSelected(item);

    }

Использование NavUtils.navigateUpFromSameTask(this); работало для меня вместо finish().

1
Gi Tavares

Если вы используете ActionBar, вы захотите прочитать эту документацию http://developer.Android.com/reference/Android/app/ActionBar.html#setDisplayHomeAsUpEnabled (boolean)

Затем вам нужно переписать метод onOptionsItemSelected (MenuItem) и найти событие Android.R.id.home, чтобы войти. Затем вы знаете, что пользователь нажал на эту кнопку назад на панели действий

1
Paul Thompson
Toolbar toolbar=findViewById(R.id.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

if (getSupportActionBar()==null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==Android.R.id.home)
    finish();
return super.onOptionsItemSelected(item);
}
0
Abhay Agrawal

Вы также можете просто вставить onBackPressed() в слушатель onClick. Это заставляет вашу кнопку работать как стандартные кнопки "назад/вверх" в приложениях Android!

0
user3700215

Это также можно сделать без кода, указав родительское действие в манифесте приложения. Если вам нужна кнопка "Назад" в действии B, которая перейдет к действию A, просто добавьте действие A в качестве родительского для действия B в манифесте.

0
aby4reality

В других ответах не упоминается, что вы также можете установить это в XML вашего виджета Toolbar:

app:navigationIcon="?attr/homeAsUpIndicator"

Например:

<Android.support.v7.widget.Toolbar
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    Android:background="?attr/colorPrimary"
    app:navigationIcon="?attr/homeAsUpIndicator"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:title="@string/title_activity_acoustic_progress" />
0
Michael Litvin

Просто делюсь тем, что помогло мне и может быть полезным для других. Хотя большинство ответов здесь верны, с помощью getActionBar().setDisplayHomeAsUpEnabled(true); это не сработало для меня. Проблема, с которой я столкнулся, заключалась в том, что я пытался создать второе действие вручную, но в нем есть больше деталей.
Что действительно решило мою проблему, так это следующее Android руководство для разработчиков ( https://developer.Android.com/training/basics/firstapp/starting-activity ) для создания Второе занятие с использованием Android собственных инструментов Studio:

Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.
0
ofri cofri

Это работает для меня .. Предположим, есть два вида деятельности (Activityone, Activitytwo)

Внутри Activityв два раза использовали этот код

@Override
protected void onCreate(Bundle savedInstanceState) {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

На Activityone

//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));

Это должно быть включено во второе действие в файле манифеста

<activity Android:name=".Activitytwo"
        Android:parentActivityName=".Activityone"></activity>

И результат будет таким

enter image description here

0
Muhaiminur Rahman

Для котлина:

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        onBackPressed();
        return true;
    }
0
Raluca Lucaci