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