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


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

15 75

15 ответов:

есть два простых шага, чтобы создать кнопку "Назад" в заголовке:

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

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

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

enter image description here

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

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

}

вот именно!

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

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

и в ваших действиях

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

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

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

  int id = item.getItemId();

     if (id==android.R.id.home) {
        finish();
    }

мне наконец-то удалось правильно добавить кнопку Назад в actionbar/toolbar

@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;
}

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 () подходит только для вашего приложения является владельцем текущей задачи (то есть пользователь начал эту задачу из вашего приложения). Если это не так, и ваша деятельность была начата в задача, которая принадлежит другому приложению, а затем навигация вверх должна создать новая задача, принадлежащая вашему приложению, которая требует создания новый задний стек.

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

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);

            [...]
        }

        [...]
    }

ничего еще нужно сделать, смотрите добавить действие

[необязательно]для явного определения родительской активности измените Манифест.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>

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

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

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

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

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

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

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

Если вы используете новую библиотеку поддержки для 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);

ура.

прежде всего в функции 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);
    }

если ваша деятельность распространяется 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() поэтому кнопка "назад" на телефоне и стрелка на панели инструментов сделать то же самое.

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

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

облегченная версия без использования 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.

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

<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");
    }

вот как я решил проблема. Спасибо.

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

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

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);
}