Объедините AdapterView с навигационным ящиком

У меня есть навигационный ящик в MainActivity моего приложения. В этом упражнении устанавливается AdapterView. Когда я щелкаю одну из строк адаптера, я хочу открыть новое действие, но под тем же навигационным блоком:

searchResultList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        startActivity(new Intent(MainActivity.this, Details.class));
    }
});

Прямо сейчас новое действие (Детали) открывается без отображения панели навигации.

Пожалуйста, покажи мне, как это сделать, не записывая код навигационного ящика для каждого вида деятельности...

Заранее спасибо.

1 ответ

Эй, прежде чем вы посмотрите на ответ, вы должны посмотреть это Android Dev Summit Video, оно даст вам хорошее представление о том, что делать, плюс у него есть новый способ легко достичь навигационной раскладки ящика. Для этого у вас есть два варианта, первым и наиболее предпочтительным является использование Fragments вместо вашего Activities и есть один FragmentActivity это имеет ваш DrawerLayout и FrameLayout который будет содержать представление "Фрагмент".

FragmentActivity.java

    <android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- The main content view -->
<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
<!-- The navigation drawer -->
<ListView android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp"
    android:background="#111"/>

Вот что в документации по Android для использования DrawerLayout Вы можете найти это более подробно здесь.

Если вам интересно, как вы можете добавить Fragments на ваш Activity в коде вот что вам нужно сделать:

      FragmentManager fm = getSupportFragmentManager();
      /*if you are using a FragmentActivity or an AppCompatActivity as
      your super class you'll need to use getSupportFragmentManager 
      method*/
      FragmentTransaction ft = fm.beginTransaction();
      ft.replace(R.id.YOUR_FRAMELAYOUT_ID, fragment, fargmentTag);
      /*Here you should add your frameLayout ID as your first argument
      Thats where your new fragment will reside on the screen its like
      an iframe.
      This will replace the current fragment shown in your frameLayout if any and 
      add the new one*/
      ft.addToBackStack(null);
      /*You can add your fragment to your backstack and assign a String value 
      as its key if you want to get back to it in the future*/
      ft.commit();
      //By commiting you apply the Fragment transaction and start 
      //drawing the Fragment on screen

Другой вариант - иметь Parent Activity который имеет код и настройки просмотра для DrawerLayout и вы выходите из этого ParentActivity в вашем Activities, Вам также нужно будет использовать есть parent_activity.xml это будет иметь DrawerLayout в качестве основного тега и есть ViewStub добавить каждый из ваших Activity посмотреть в нем.

parent_activity.xml

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<ViewStub
    android:id="@+id/layout_stub"
    android:inflatedId="@+id/myActivityLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

а вот какой твой ParentActivty то, что вы должны наследовать, должно выглядеть так:

ParentActivty.java

public class ParentActivity extends AppCompatActivity {

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

public void setUpChildActivityView(int childActivityView){
    ViewStub stub = (ViewStub) findViewById(R.id.layout_stub);
    stub.setLayoutResource(childActivityView);
    View inflated = stub.inflate();
}}

Вы можете позвонить setUpChildActivtiyView() метод из вашего нового Activity чтобы установить свой контент, вы также можете достичь того же результата, не используя ViewStub но с раздувать и добавлять свой новый Activity вид на ParentActivity просмотр с помощью addView() метод.


Лично я предпочитаю первый вариант, так как это соглашение, которое есть в документации, но вы можете сделать это любым способом.

Другие вопросы по тегам