programing

서로 다른 활동에서 동일한 탐색 드로어

instargram 2023. 8. 25. 23:14
반응형

서로 다른 활동에서 동일한 탐색 드로어

저는 developer.android.com 웹사이트의 튜토리얼에 나와 있는 것처럼 작동하는 내비게이션 서랍을 만들었습니다.그러나 이제 응용프로그램의 여러 활동에 대해 NavigationDrawer.class에서 만든 하나의 NavigationDrawer를 사용하려고 합니다.

제 질문은 여기 계신 분 중에 하나의 탐색 드로어를 여러 활동에 사용하는 방법에 대해 설명하는 작은 튜토리얼을 만들 수 있는 분이 있는지 여부입니다.

여러 활동에 대한Android 내비게이션 드로어에서 먼저 읽었습니다.

하지만 제 프로젝트에서는 작동하지 않았습니다.

public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) {

        public void onDrawerClosed(View view) {
            getActionBar().setTitle(R.string.app_name);
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(R.string.menu);
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    listItems = getResources().getStringArray(R.array.layers_array);
    drawerList = (ListView) findViewById(R.id.left_drawer);
    drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text,
            listItems));
    
    drawerList.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
            drawerClickEvent(pos);
        }
    });
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);

}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    drawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    drawerToggle.onConfigurationChanged(newConfig);
}
}

이 활동에서는 내비게이션 드로어를 사용하여 '내비게이션 드로어'를 확장하고 일부 다른 활동에서는 동일한 내비게이션 드로어를 사용합니다.

  public class SampleActivity extends NavigationDrawer {...}

탐색 드로어를 사용하려면 조각을 사용해야 합니다.저는 지난주에 이 튜토리얼을 따랐고 잘 작동합니다.

http://developer.android.com/training/implementing-navigation/nav-drawer.html

이 튜토리얼에서 샘플 코드를 다운로드하여 방법을 확인할 수도 있습니다.


조각 없음:

기본 활동 코드는 다음과 같습니다.

public class BaseActivity extends Activity
{
    public DrawerLayout drawerLayout;
    public ListView drawerList;
    public String[] layers;
    private ActionBarDrawerToggle drawerToggle;
    private Map map;
    
    protected void onCreate(Bundle savedInstanceState)
    {
        // R.id.drawer_layout should be in every activity with exactly the same id.
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        
        drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) 
        {
            public void onDrawerClosed(View view) 
            {
                getActionBar().setTitle(R.string.app_name);
            }
    
            public void onDrawerOpened(View drawerView) 
            {
                getActionBar().setTitle(R.string.menu);
            }
        };
        drawerLayout.setDrawerListener(drawerToggle);
    
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);
        
        layers = getResources().getStringArray(R.array.layers_array);
        drawerList = (ListView) findViewById(R.id.left_drawer);
        View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
        drawerList.addHeaderView(header, null, false);
        drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
                layers));
        View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
                R.layout.drawer_list_footer, null, false);
        drawerList.addFooterView(footerView);
    
        drawerList.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
                map.drawerClickEvent(pos);
            }
        });
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        if (drawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    
    }
    
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        drawerToggle.syncState();
    }
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        drawerToggle.onConfigurationChanged(newConfig);
    }
}

탐색 드로어가 필요한 다른 모든 활동은 활동 자체 대신 이 활동을 확장해야 합니다. 예:

public class AnyActivity extends BaseActivity
{
    //Because this activity extends BaseActivity it automatically has the navigation drawer
    //You can just write your normal Activity code and you don't need to add anything for the navigation drawer
}

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">
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <!-- Put what you want as your normal screen in here, you can also choose for a linear layout or any other layout, whatever you prefer -->
    </FrameLayout>
    <!-- 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.support.v4.widget.DrawerLayout>

편집:

저도 몇 가지 어려움을 겪었기 때문에 NullPointer를 얻으면 여기 해결책이 있습니다.例예.을 Base Activity로 변경합니다.protected void onCreateDrawer()나머지는 그대로 있을 수 있습니다.기본 활동을 확장하는 활동에서 코드를 다음 순서로 입력합니다.

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
    super.onCreateDrawer();

이렇게 하면 여러 활동이 있는 탐색 드로어를 만들 수 있습니다. 질문이 있으면 언제든지 질문할 수 있습니다.


편집 2:

@GregDan이 말했듯이 당신은 또한 무시할 수 있습니다.setContentView()CreateDrawer입니다.

@Override 
public void setContentView(@LayoutRes int layoutResID) 
{ 
    super.setContentView(layoutResID); 
    onCreateDrawer() ;
}

최상의 구현 방법을 찾았습니다.Google I/O 2014 에 있습니다.

그들은 케빈과 같은 접근법을 사용합니다.만약 당신이 I/O 앱에서 불필요한 모든 것들로부터 당신 자신을 추상화할 수 있다면, 당신은 당신이 필요로 하는 모든 것을 추출할 수 있고 구글은 그것이 내비게이션 서랍 패턴의 정확한 사용이라고 확신합니다.으로 각활에선다있로습다니음이으택적는동▁a다▁option있▁each니습▁hasally다▁activity음이가 있습니다.DrawerLayout입니다.흥미로운 부분은 다른 화면으로 이동하는 방법입니다.은 다에서구다니에서 됩니다.BaseActivity다음과 같이:

private void goToNavDrawerItem(int item) {
        Intent intent;
        switch (item) {
            case NAVDRAWER_ITEM_MY_SCHEDULE:
                intent = new Intent(this, MyScheduleActivity.class);
                startActivity(intent);
                finish();
                break;

이는 현재 조각을 조각 트랜잭션으로 대체하는 일반적인 방법과는 다릅니다.그러나 사용자는 시각적 차이를 발견하지 못합니다.

그래서 이 대답은 몇 년 늦었지만 누군가는 고마워할지도 모릅니다.Android는 여러 가지 활동으로 하나의 탐색 서랍을 더 쉽게 사용할 수 있는 새로운 위젯을 제공했습니다.

안드로이드의서포트.디자인.위젯NavigationView는 모듈식이며 메뉴 폴더에 자체 레이아웃이 있습니다.xml 레이아웃은 다음과 같은 방식으로 래핑합니다.

  1. 루트 레이아웃은 안드로이드입니다.support.v4.vmdk.에는 두됩니다. DrowerLayout에는 DrowerLayout:<include ... />포장 중인 레이아웃(2 참조) 및 안드로이드.서포트.디자인. 보기탐색 보기.

    <android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:openDrawer="start">
    
    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />
    

nav_drawar_main은 방향이 = 수직인 선형 레이아웃일 뿐입니다.

activity_main_dll은 res/dll 디렉토리에 있는 메뉴 xml입니다.선택한 항목 및 그룹을 포함할 수 있습니다.Android Studio Gallery(Android 스튜디오 갤러리)를 사용하면 마법사가 기본적인 갤러리를 만들고 옵션을 볼 수 있습니다.

  1. 앱 모음 레이아웃은 일반적으로 안드로이드입니다.서포트.디자인. 됩니다.코디네이터 레이아웃과 여기에는 안드로이드라는 두 아이가 포함됩니다.서포트.디자인.포함).AppBar 레이아웃(안드로이드 포함).support.v7.support. 모음) 및 " 모음"<include ... >실제 내용을 확인할 수 있습니다(3 참조).

    <android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="yourpackage.MainActivity">
    
     <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    
    </android.support.design.widget.AppBarLayout>
    
    <include layout="@layout/content_main" />
    

  2. 내용 레이아웃은 원하는 레이아웃이 될 수 있습니다.이것은 활동의 기본 내용을 포함하는 레이아웃입니다(탐색 드로어 또는 앱 모음은 포함하지 않음).

이 모든 것의 멋진 점은 각 활동을 두 개의 레이아웃으로 묶을 수 있지만 탐색 보기(1단계 참조)가 항상 활동_main_drawer(또는 무엇이든)를 가리키도록 할 수 있다는 것입니다.즉, 모든 활동에 대해 동일한(*) 탐색 드로어를 사용할 수 있습니다.

  • 이들은 NavigationView와 동일한 인스턴스는 아니지만, 공정하게 말하면 위에 설명된 Base Activity 솔루션으로도 가능하지 않았습니다.

활동 그룹 중 공통 탐색 드로어를 재사용하는 가장 쉬운 방법

app_base_message.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <FrameLayout
        android:id="@+id/view_stub"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </FrameLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/menu_test"
        />
</android.support.v4.widget.DrawerLayout>

AppBase Activity.java

/*
* This is a simple and easy approach to reuse the same 
* navigation drawer on your other activities. Just create
* a base layout that conains a DrawerLayout, the 
* navigation drawer and a FrameLayout to hold your
* content view. All you have to do is to extend your 
* activities from this class to set that navigation 
* drawer. Happy hacking :)
* P.S: You don't need to declare this Activity in the 
* AndroidManifest.xml. This is just a base class.
*/
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

public abstract class AppBaseActivity extends AppCompatActivity implements MenuItem.OnMenuItemClickListener {
    private FrameLayout view_stub; //This is the framelayout to keep your content view
    private NavigationView navigation_view; // The new navigation view from Android Design Library. Can inflate menu resources. Easy
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private Menu drawerMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.app_base_layout);// The base layout that contains your navigation drawer.
        view_stub = (FrameLayout) findViewById(R.id.view_stub);
        navigation_view = (NavigationView) findViewById(R.id.navigation_view);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 0, 0);
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        drawerMenu = navigation_view.getMenu();
        for(int i = 0; i < drawerMenu.size(); i++) {
          drawerMenu.getItem(i).setOnMenuItemClickListener(this);
        }
        // and so on...
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    /* Override all setContentView methods to put the content view to the FrameLayout view_stub
     * so that, we can make other activity implementations looks like normal activity subclasses.
     */
    @Override
    public void setContentView(int layoutResID) {
        if (view_stub != null) {
            LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);
            View stubView = inflater.inflate(layoutResID, view_stub, false);
            view_stub.addView(stubView, lp);
        }
    }

    @Override
    public void setContentView(View view) {
        if (view_stub != null) {
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);
            view_stub.addView(view, lp);
        }
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        if (view_stub != null) {
            view_stub.addView(view, params);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle your other action bar items...

        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item1:
                // handle it
                break;
            case R.id.item2:
                // do whatever
                break;
            // and so on...
        }
        return false;
    }
}

원래 포스터가 요청하는 것을 하려는 다른 사람들은 케빈이 말한 방식 대신 파편을 사용하는 것을 고려해 주십시오.다음은 이 방법에 대한 훌륭한 튜토리얼입니다.

https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer

조각 대신 활동을 사용하도록 선택하면 새 활동으로 이동할 때마다 탐색 드로어가 다시 생성되는 문제에 직면하게 됩니다.그 결과 매번 탐색 드로어의 렌더링 속도가 느려집니다.

활동을 전혀 사용하지 말고 조각을 사용하고 첫 번째 조각을 표시하는 컨테이너(예: 선형 레이아웃)에서 교체하는 것이 좋습니다.[참고: 탐색 그래프를 사용하여 이 개념을 사용할 수 있습니다.Composite는 레이아웃 XML을 만들 필요성을 더욱 줄여주기 때문에 여기에도 적용할 수 있습니다.]

코드는 Android Developer Tutorials에서 사용할 수 있으며 사용자 지정만 하면 됩니다.

http://developer.android.com/training/implementing-navigation/nav-drawer.html

애플리케이션에서 점점 더 많은 조각을 사용하는 것이 바람직하며, 외부 활동(Facebook) 외에 AndroidManifest.xml에서 언급한 애플리케이션의 로컬 기본 활동은 4개뿐이어야 합니다.활동 예):

  1. 스플래시 활동: 조각을 사용하지 않고 전체 화면 테마를 사용합니다.

  2. 로그인 등록 활동:NavigationDrawer가 전혀 필요하지 않으며, 뒤로 버튼도 필요하지 않으므로 일반 도구 모음을 사용하기만 하면 되지만 최소 3개 또는 4개의 조각이 필요합니다.무동작 막대 테마 사용

  3. 홈 활동 또는 대시보드 활동:무동작 막대 테마를 사용합니다.여기에는 탐색 드로어가 필요하며, 이후에 이어지는 모든 화면은 공유 드로어와 함께 리프 뷰까지 조각 또는 중첩된 조각이 됩니다.이 활동에서는 모든 설정, 사용자 프로필 등이 조각으로 표시됩니다.여기에 있는 조각은 백스택에 추가되지 않으며 드로어 메뉴 항목에서 열립니다.드로어 대신 뒤로 버튼이 필요한 fragment의 경우 아래 네 번째 종류의 액티비티가 있습니다.

  4. 드로어가 없는 활동입니다.이 활동은 맨 위에 뒤로 단추가 있으며 내부의 조각은 동일한 수행 표시줄을 공유합니다.이러한 조각은 탐색 기록이 있으므로 백스택에 추가됩니다.

[ 자세한 지침은 https://stackoverflow.com/a/51100507/787399 을 참조하십시오.

해피 코딩!!

기본 활동에서 이 코드를 업데이트합니다.활동 xml에 drawer_list_messages를 포함하는 것을 잊지 마십시오.

super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.drawer_list_header);

그리고 당신의 활동에 요청을 사용하지 마세요.그래도 클릭 이미지에는 드로어가 보이지 않습니다.드래그하면 목록 항목 없이 볼 수 있습니다.저는 많은 노력을 했지만 성공하지 못했습니다.이것을 위한 운동이 필요합니다...

@Kevin van Mierlo의 답변을 통해 여러 서랍을 구현할 수도 있습니다.예를 들어 왼쪽에 있는 기본 메뉴(시작)와 오른쪽에 있는 추가 선택 메뉴(결정된 조각이 로드된 경우에만 표시됨)가 있습니다.

저는 그렇게 할 수 있었습니다.

package xxxxxx;



import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.widget.SearchView;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
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;
import android.widget.Toast;


public class loginhome extends AppCompatActivity {
    private Toolbar toolbar;
    private NavigationView navigationView;
    private DrawerLayout drawerLayout;

    // Make sure to be using android.support.v7.app.ActionBarDrawerToggle version.
    // The android.support.v4.app.ActionBarDrawerToggle has been deprecated.
    private ActionBarDrawerToggle drawerToggle;

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

        // Initializing Toolbar and setting it as the actionbar
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        //Initializing NavigationView


        navigationView = (NavigationView) findViewById(R.id.nav_view);

        //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            // This method will trigger on item Click of navigation menu

            public boolean onNavigationItemSelected(MenuItem menuItem) {


                //Checking if the item is in checked state or not, if not make it in checked state
                if(menuItem.isChecked()) menuItem.setChecked(false);
                else menuItem.setChecked(true);

                //Closing drawer on item click
                drawerLayout.closeDrawers();

                //Check to see which item was being clicked and perform appropriate action
                switch (menuItem.getItemId()){


                    //Replacing the main content with ContentFragment Which is our Inbox View;
                    case R.id.nav_first_fragment:
                        Toast.makeText(getApplicationContext(),"First fragment",Toast.LENGTH_SHORT).show();
                         FirstFragment fragment = new FirstFragment();
                        android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.frame,fragment);
                        fragmentTransaction.commit();
                        return true;

                    // For rest of the options we just show a toast on click
                    case R.id.nav_second_fragment:
                        Toast.makeText(getApplicationContext(),"Second fragment",Toast.LENGTH_SHORT).show();
                        SecondFragment fragment2 = new SecondFragment();
                        android.support.v4.app.FragmentTransaction fragmentTransaction2 = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction2.replace(R.id.frame,fragment2);
                        fragmentTransaction2.commit();
                        return true;

                    default:
                        Toast.makeText(getApplicationContext(),"Somethings Wrong",Toast.LENGTH_SHORT).show();
                        return true;

                }
            }
        });

        // Initializing Drawer Layout and ActionBarToggle
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close){

            @Override
            public void onDrawerClosed(View drawerView) {
                // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank
                super.onDrawerClosed(drawerView);
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank

                super.onDrawerOpened(drawerView);
            }
        };

        //Setting the actionbarToggle to drawer layout
        drawerLayout.setDrawerListener(actionBarDrawerToggle);

        //calling sync state is necessay or else your hamburger icon wont show up
        actionBarDrawerToggle.syncState();







    }

툴바.xml에 사용합니다.

<?xml version="1.0" encoding="utf-8"?>

    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:elevation="4dp"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark"


        >

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

사용하려면 탐색 헤더에 사용합니다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:background="?attr/colorPrimaryDark"
    android:padding="16dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark"
    android:orientation="vertical"
    android:gravity="bottom">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:id="@+id/navhead"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:textColor="#ffffff"
            android:text="tanya"
            android:textSize="14sp"
            android:textStyle="bold"

            />

        <TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="5dp"
            android:text="tanya.com"
            android:textSize="14sp"
            android:textStyle="normal"

            />
    </LinearLayout>
    <de.hdodenhof.circleimageview.CircleImageView
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_below="@+id/imageView"
        android:layout_marginTop="15dp"

        android:src="@drawable/face"
        android:id="@+id/circleView"
        />



</RelativeLayout>

저는 코틀린에서 이렇게 합니다.

open class BaseAppCompatActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

protected lateinit var drawerLayout: DrawerLayout
protected lateinit var navigationView: NavigationView
@Inject
lateinit var loginService: LoginService

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d("BaseAppCompatActivity", "onCreate()")
    App.getComponent().inject(this)
    drawerLayout = findViewById(R.id.drawer_layout) as DrawerLayout

    val toolbar = findViewById(R.id.toolbar) as Toolbar
    setSupportActionBar(toolbar)

    navigationView = findViewById(R.id.nav_view) as NavigationView
    navigationView.setNavigationItemSelectedListener(this)

    val toggle = ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)

    drawerLayout.addDrawerListener(toggle)
    toggle.syncState()
    toggle.isDrawerIndicatorEnabled = true

    val navigationViewHeaderView = navigationView.getHeaderView(0)
    navigationViewHeaderView.login_txt.text = SharedKey.username
}
private inline fun <reified T: Activity> launch():Boolean{
    if(this is T) return closeDrawer()
    val intent = Intent(applicationContext, T::class.java)
    startActivity(intent)
    finish()
    return true
}

private fun closeDrawer(): Boolean {
    drawerLayout.closeDrawer(GravityCompat.START)
    return true
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    when (id) {
        R.id.action_tasks -> {
            return launch<TasksActivity>()
        }
        R.id.action_contacts -> {
            return launch<ContactActivity>()
        }
        R.id.action_logout -> {
            createExitDialog(loginService, this)
        }
    }
    return false
}
}

에 대한 은 이 드어에활이상합야니다해속를대동로를 .BaseAppCompatActivity, 전화 걸기super.onCreate할 수 ) 에 해당하는 요소가 .

제 대답은 소스 코드가 없는 개념적인 대답입니다.저와 같은 독자들이 이해하는 것이 유용할 수도 있습니다.

앱을 어떻게 설계하느냐에 따라 초기 접근 방식이 달라집니다.기본적으로 두 가지 접근 방식이 있습니다.

  1. 하나의 활동(기본 활동)을 작성하면 다른 모든 보기와 화면이 조각이 됩니다.이 기본 활동에는 드로어 및 코디네이터 레이아웃에 대한 구현이 포함됩니다.작은 자체 포함 조각이 있으면 앱 개발을 더 쉽고 원활하게 할 수 있기 때문에 실제로는 제가 선호하는 방식입니다.

  2. 각 화면마다 하나씩 활동으로 앱 개발을 시작한 경우 기본 활동을 만들고 다른 모든 활동이 해당 활동에서 확장됩니다.기본 활동에는 드로어 및 코디네이터 구현을 위한 코드가 포함됩니다.드로어 구현이 필요한 모든 활동은 기본 활동에서 확장될 수 있습니다.

저는 개인적으로 어떤 조직도 없이 단편적인 활동과 활동을 섞는 것을 피하는 것을 선호합니다.그것은 개발을 더 어렵게 만들고 결국 당신을 꼼짝 못하게 만듭니다.이 작업을 완료한 경우 코드를 다시 팩토링합니다.

다음 비디오 튜토리얼에 자세히 설명되어 있습니다.

기본 활동을 사용한 여러 활동의 탐색 드로어

기본 탐색 드로어 활동을 만들고 기본 탐색 드로어 활동을 탐색 드로어를 표시하려는 모든 활동으로 확장하는 것은 매우 쉽습니다.

  1. 탐색 메뉴 만들기, 머리글
  2. 탐색 드로어에 대한 기본 활동 만들기
  3. 내용 레이아웃 만들기
  4. 결합된 메뉴, 머리글, 기본 활동에 대한 내용 레이아웃
  5. 프레임 레이아웃을 사용하여 드로어 메뉴에 모든 활동을 삽입합니다.

모든 단계가 비디오에 명확하게 설명되어 있습니다.

조각을 사용하여 기본 활동에 탐색 드로어를 만듭니다.
기본 활동에서 탐색 드로어 초기화
이제 다른 모든 활동에서 동일한 Navigation Drawer Layout을 기본으로 하고 fragment를 Navigation Drawer로 설정합니다.조각에 조각 자바 파일을 가리키도록 Android:name을 설정하기만 하면 됩니다.다른 활동에서 조각을 초기화할 필요가 없습니다.
Google Play Store 앱과 같은 다른 활동에서 스와이프를 사용하여 Nav Drawer에 액세스할 수 있습니다.

언급URL : https://stackoverflow.com/questions/19451715/same-navigation-drawer-in-different-activities

반응형