สลับระหว่างอิมเมจลิ้นชักการนำทาง Android และ Caret เมื่อใช้แฟรกเมนต์


177

เมื่อใช้ Navigation Drawer ผู้พัฒนา Android จะแนะนำให้ใช้ใน ActionBar "เฉพาะหน้าจอที่แสดงใน Navigation Drawer เท่านั้นที่ควรมีภาพ Navigation Drawer" และ "หน้าจออื่น ๆ ทั้งหมดมีกะรัตดั้งเดิม"

ดูที่นี่สำหรับรายละเอียด: http://youtu.be/F5COhlbpIbY

ฉันใช้กิจกรรมเดียวเพื่อควบคุมเศษชิ้นส่วนหลายระดับและสามารถใช้อิมเมจลิ้นชักนำทางเพื่อแสดงและใช้งานได้ในทุกระดับ

เมื่อสร้างชิ้นส่วนระดับต่ำกว่าฉันสามารถเรียกใช้ActionBarDrawerToggle setDrawerIndicatorEnabled(false)เพื่อซ่อนภาพลิ้นชักการนำทางและแสดงคาเร็ตขึ้น

LowerLevelFragment lowFrag = new LowerLevelFragment();

//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout, 
lowFrag, "lowerFrag").addToBackStack(null).commit();

ปัญหาที่ฉันมีคือเมื่อฉันนำทางกลับไปที่ชิ้นส่วนระดับบนสุดขึ้นกะรัตยังคงแสดงแทนภาพลิ้นชักการนำทางเดิม คำแนะนำใด ๆ เกี่ยวกับวิธี "รีเฟรช" ActionBar ในแฟรกเมนต์ระดับบนสุดเพื่อแสดงอิมเมจลิ้นชักการนำทางอีกครั้ง?


สารละลาย

ข้อเสนอแนะของทอมทำงานให้ฉัน นี่คือสิ่งที่ฉันทำ:

กิจกรรมหลัก

กิจกรรมนี้ควบคุมชิ้นส่วนทั้งหมดในแอป

เมื่อเตรียมชิ้นส่วนใหม่เพื่อแทนที่ชิ้นส่วนอื่นฉันตั้งค่า drawerToggle setDrawerIndicatorEnabled(false)ดังนี้:

LowerLevelFragment lowFrag = new LowerLevelFragment();

//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,   
lowFrag).addToBackStack(null).commit();

ถัดไปในการแทนที่onBackPressedฉันจะย้อนกลับด้านบนโดยการตั้งค่า drawerToggle เป็นsetDrawerIndicatorEnabled(true)ดังนี้:

@Override
public void onBackPressed() {
    super.onBackPressed();
    // turn on the Navigation Drawer image; 
    // this is called in the LowerLevelFragments
    setDrawerIndicatorEnabled(true)
}

ใน LowerLevelFragments

ในส่วนที่ฉันแก้ไขonCreateและonOptionsItemSelectedเช่นนี้:

กำลังonCreateเพิ่มsetHasOptionsMenu(true)เพื่อเปิดใช้งานการกำหนดค่าเมนูตัวเลือก ตั้งค่าsetDisplayHomeAsUpEnabled(true)ให้เปิดใช้งาน<ใน actionbar ด้วย:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // needed to indicate that the fragment would 
    // like to add items to the Options Menu        
    setHasOptionsMenu(true);    
    // update the actionbar to show the up carat/affordance 
    getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}

จากนั้นonOptionsItemSelectedเมื่อใดก็ตามที่มีการกด<มันจะเรียกonBackPressed()จากกิจกรรมเพื่อเลื่อนขึ้นหนึ่งระดับในลำดับชั้นและแสดงภาพการนำทางลิ้นชัก:

@Override
public boolean onOptionsItemSelected(MenuItem item) {   
    // Get item selected and deal with it
    switch (item.getItemId()) {
        case android.R.id.home:
            //called when the up affordance/carat in actionbar is pressed
            getActivity().onBackPressed();
            return true;
         
    }

2
นอกจากนี้ในเมธอด onBackPressed () ของคุณคุณสามารถตรวจสอบจำนวนรายการที่อยู่ในสแต็กหลังด้วยเมธอด getFragmentManager () เมธอด getBackStackEntryCount () และเปิดใช้งานตัวบ่งชี้ลิ้นชักเฉพาะในกรณีที่ผลลัพธ์เป็น 0 ในกรณีนั้นไม่จำเป็นต้องเปิดใช้งาน
pvshnik

2
มันมีประโยชน์มาก! คุณควรย้ายส่วน "โซลูชัน" ของโพสต์และทำให้เป็น "คำตอบ" จริง คุณจะได้รับคะแนนมากขึ้นสำหรับ upvotes และมันเป็นคำตอบหลังจากทั้งหมด
Oleksiy

ทำไมคุณต้องเปลี่ยนชิ้นส่วนที่นี่: .replace(R.id.frag_layout. หากนี่คือระดับลำดับชั้นที่มากกว่าหนึ่งฉันคาดหวังให้คุณ.addไปที่ backstack
JJD

5
ครับคุณอ้างอิงtheDrawerToggle.setDrawerIndicatorEnabled(false);ส่วนในอย่างไร ฉันคิดว่ามันถูกประกาศในไฟล์คลาสกิจกรรมหลัก ฉันหาวิธีอ้างอิงนี้ไม่ได้ คำใบ้ใด ๆ
Skynet

1
เมื่อใช้แถบเครื่องมือฉันต้องสลับตัวเลือกการแสดงผลเพื่อไม่ให้ใช้งานภายในบ้านในเวลาเดียวกัน มิฉะนั้นsetDisplayOptions()วิธีการภายในToolbarWidgetWrapper(ของแพคเกจ android.support.v7.internal.widget ภายใน) จะไม่สร้างไอคอนขึ้นใหม่เมื่อป้อนชิ้นส่วนเดียวกันเป็นครั้งที่สอง เพิ่งออกจากที่นี่เพื่อเมื่อคนอื่นสะดุดกับปัญหานี้เช่นกัน
Wolfram Rittmeyer

คำตอบ:


29

คุณเขียนว่าในการใช้แฟรกเมนต์ระดับต่ำกว่าคุณกำลังแทนที่แฟรกเมนต์ที่มีอยู่ซึ่งตรงข้ามกับการใช้แฟรกเมนต์ระดับล่างในกิจกรรมใหม่

ฉันคิดว่าคุณจะต้องใช้ฟังก์ชั่นด้านหลังด้วยตนเอง: เมื่อผู้ใช้กดกลับคุณมีรหัสที่ปรากฏสแต็ก (เช่นในการActivity::onBackPressedแทนที่) setDrawerIndicatorEnabledดังนั้นทุกที่ที่คุณทำเช่นนั้นคุณสามารถย้อนกลับ


ขอบคุณทอมที่ได้ผล! ฉันได้อัปเดตโพสต์ดั้งเดิมด้วยโซลูชันที่ฉันใช้
EvilAsh

6
วิธีการอ้างอิง theDrawerToggle ในแฟรกเมนต์ระดับล่าง มันถูกกำหนดไว้ในกิจกรรมหลักแล้วไม่สามารถทำสิ่งนี้ได้!
Skynet

1
คุณสามารถรับกิจกรรมได้จากส่วน ดังนั้นเพียงเพิ่มผู้ทะเยอทะยานในกิจกรรมหลักของคุณเพื่อเข้าถึงการสลับลิ้นชัก
Raphael Royer-Rivard

83

มันง่ายเหมือน 1-2-3

หากคุณต้องการบรรลุ:

1) ตัวบ่งชี้ลิ้นชัก - เมื่อไม่มีเศษอยู่ในกองซ้อนด้านหลังหรือลิ้นชักถูกเปิด

2) ลูกศร - เมื่อชิ้นส่วนบางชิ้นอยู่ใน Back Stack

private FragmentManager.OnBackStackChangedListener
        mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() {
    @Override
    public void onBackStackChanged() {
        syncActionBarArrowState();
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    mDrawerToggle = new ActionBarDrawerToggle(
            this,             
            mDrawerLayout,  
            R.drawable.ic_navigation_drawer, 
            0, 
            0  
    ) {

        public void onDrawerClosed(View view) {
            syncActionBarArrowState();
        }

        public void onDrawerOpened(View drawerView) {
            mDrawerToggle.setDrawerIndicatorEnabled(true);
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);
    getSupportFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);
}

@Override
protected void onDestroy() {
    getSupportFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener);
    super.onDestroy();
}

private void syncActionBarArrowState() {
    int backStackEntryCount = 
        getSupportFragmentManager().getBackStackEntryCount();
    mDrawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}

3) ตัวบ่งชี้ทั้งสองจะทำหน้าที่ตามรูปร่างของพวกเขา

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.isDrawerIndicatorEnabled() && 
        mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    } else if (item.getItemId() == android.R.id.home && 
               getSupportFragmentManager().popBackStackImmediate()) {
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}

PS ดูการสร้างการนำทางลิ้นชักบนนักพัฒนา Androidเกี่ยวกับเคล็ดลับอื่น ๆ เกี่ยวกับพฤติกรรมของตัวบ่งชี้ 3 บรรทัด


3
ฉันลงเอยกับสิ่งที่คล้ายกับของคุณ ฉันคิดว่าวิธีนี้ (ใช้ BackStackChangedListener เพื่อพลิกระหว่างสิ่งที่แสดง) เป็นวิธีที่ดีที่สุด อย่างไรก็ตามฉันมีการเปลี่ยนแปลงสองอย่าง: 1) ฉันไม่เรียก / เปลี่ยนตัวบ่งชี้ drawer ในการเรียกใช้ onDrawerClosed / onDrawerOpened - ไม่จำเป็นและ 2) ฉันให้แฟรกเมนต์จัดการการนำทาง Up โดยการทำให้ AbstractFragment ใช้ onOptionsItemSelected (.. ) และที่จะเรียก setHasOptionsMenu (true) เสมอ
Espen Riskedal

2
Yout ควรล็อคท่าทางการกวาดนิ้วสำหรับลิ้นชักการนำทางในโหมดลูกศร: mDrawerLayout.setDrawerLockMode (drawerLayout.LOCK_MODE_LOCKED_CLOSED); และเปิดใช้งานอีกครั้งในโหมดตัวบ่งชี้ลิ้นชัก
artkoenig

5
ฉันทำสิ่งนี้ทั้งหมดในส่วน NavigationDrawer ของฉัน ทำงานเหมือนเสน่ห์ btw ขอบคุณ
frostymarvelous

1
setActionBarArrowDependingOnFragmentsBackStack()... ชื่อยาว: P
S.Thiongane

2
นี่ไม่แสดงปุ่มขึ้นสำหรับฉันเมื่อฉันไปจากแฟรกเมนต์ A เป็น B และเพิ่ม A เพื่อแบ็คสแต็ค :(
aandis

14

ฉันใช้สิ่งต่อไป:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                if(getSupportFragmentManager().getBackStackEntryCount() > 0){
                    mDrawerToggle.setDrawerIndicatorEnabled(false);
                    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                }
                else {
                    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                    mDrawerToggle.setDrawerIndicatorEnabled(true);
                }
            }
        });

1
ขอบคุณมากนี่เป็นสิ่งเดียวที่ใช้งานได้จริง เมื่อฉันเพิ่มสิ่งdrawerToggle.setToolbarNavigationClickListener(นี้ผู้ฟังนี้จะถูกเรียกใช้เมื่อคลิกที่ลูกศร
EpicPandaForce

ขอบคุณ @Yuriy สิ่งนี้ช่วยฉันในการแก้ปัญหาของฉัน
Muhammad Shoaib Murtaza

12

หากปุ่มแถบการทำงานไม่ทำงานอย่าลืมเพิ่มผู้ฟัง:

// Navigation back icon listener
mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
});

ฉันมีปัญหาในการใช้การนำทางลิ้นชักด้วยปุ่มโฮมทุกอย่างทำงานได้ยกเว้นการดำเนินการ


10

ลองจัดการการเลือกรายการบ้านในกิจกรรมหลักขึ้นอยู่กับสถานะของ DrawerToggle วิธีนี้คุณไม่จำเป็นต้องเพิ่มรหัสเดียวกันในทุกส่วน

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Only handle with DrawerToggle if the drawer indicator is enabled.
    if (mDrawerToggle.isDrawerIndicatorEnabled() &&
            mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    // Handle action buttons
    switch (item.getItemId()) {
        // Handle home button in non-drawer mode
        case android.R.id.home:
            onBackPressed();
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

+1 โซลูชั่นที่เป็นระเบียบ เพื่อให้คำตอบของคุณใช้งานได้อย่างสมบูรณ์คุณควรเพิ่มการตรวจสอบที่แบ็คสแต็ค เมื่อมันว่างเปล่าจากนั้นตั้งตัวบ่งชี้ลิ้นชักเป็นจริงโดยอัตโนมัติ
HpTerm

@ HPTerm ฉันจัดการ backstack onBackPressed()เพราะฉันต้องการพฤติกรรมเดียวกันสำหรับทั้งสอง
dzeikei

6

ติดตาม

วิธีการแก้ปัญหาที่กำหนดโดย @dzeikei นั้นเรียบร้อย แต่สามารถขยายได้เมื่อใช้แฟรกเมนต์เพื่อจัดการการตั้งค่าตัวบ่งชี้ของลิ้นชักโดยอัตโนมัติเมื่อ backstack ว่างเปล่า

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Only handle with DrawerToggle if the drawer indicator is enabled.
    if (mDrawerToggle.isDrawerIndicatorEnabled() &&
            mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    // Handle action buttons
    switch (item.getItemId()) {
        // Handle home button in non-drawer mode
        case android.R.id.home:
            // Use getSupportFragmentManager() to support older devices
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.popBackStack();
            // Make sure transactions are finished before reading backstack count
            fragmentManager.executePendingTransactions();
            if (fragmentManager.getBackStackEntryCount() < 1){
                mDrawerToggle.setDrawerIndicatorEnabled(true);  
            }
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

แก้ไข

สำหรับคำถามของ @JJD

แฟรกเมนต์จัดขึ้น / จัดการในกิจกรรม รหัสดังกล่าวเป็นลายลักษณ์อักษรครั้งหนึ่งในกิจกรรมที่ onOptionsItemSelectedแต่จัดการกับลูกศรขึ้นสำหรับ

ในหนึ่งในแอพของฉันฉันต้องจัดการกับพฤติกรรมของ caret up เมื่อกดปุ่มย้อนกลับ onBackPressedนี้สามารถจับโดยเอาชนะ

@Override
public void onBackPressed() {
    // Use getSupportFragmentManager() to support older devices
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.executePendingTransactions();
    if (fragmentManager.getBackStackEntryCount() < 1){
        super.onBackPressed();
    } else {
        fragmentManager.executePendingTransactions();
        fragmentManager.popBackStack();
        fragmentManager.executePendingTransactions();
        if (fragmentManager.getBackStackEntryCount() < 1){
            mDrawerToggle.setDrawerIndicatorEnabled(true);
        }
    }
};

จดบันทึกการทำซ้ำรหัสระหว่างonOptionsItemSelectedและonBackPressedซึ่งสามารถหลีกเลี่ยงได้โดยการสร้างวิธีการและเรียกวิธีการนั้นในทั้งสองแห่ง

นอกจากนี้โปรดทราบว่าฉันเพิ่มอีกสองครั้งexecutePendingTransactionsซึ่งในกรณีของฉันจำเป็นต้องใช้หรือบางครั้งฉันก็มีพฤติกรรมแปลก ๆ


นี่เป็นรหัสเต็มรูปแบบที่ฉันต้องเพิ่มเพื่อใช้พฤติกรรมคาเร็ตUpหรือคุณอ้างถึงหนึ่งในโพสต์อื่น ๆ ? โปรดอธิบายสิ่งนี้
JJD

ขอบคุณสำหรับการแก้ไข ที่จริงฉันเก็บรักษาไว้mDrawerToggleในNavigationDrawerFragmentชั้นเรียน เพื่อให้มันทำงานผมยังจำเป็นต้องสลับสถานะของปุ่ม home / ตัวบ่งชี้ - NavigationDrawerFragment#toggleDrawerIndicatorโปรดดูที่: นอกจากนี้ฉันไม่แน่ใจว่าคุณต้องการการเช็คอินครั้งแรกonOptionsItemSelected: ฉันไม่ใส่เครื่องหมายแสดงความคิดเห็น - ตัวอย่างที่ง่ายขึ้น
JJD

การดำเนินการแก้ไข : onOptionsItemSelectedคุณมีสิทธิเกี่ยวกับการตรวจสอบในเบื้องต้น สิ่งนี้ช่วยให้มั่นใจว่าการนำทางลิ้นชักยังคงเปิดอยู่ในลำดับชั้นบนสุด NavigationDrawerFragment#onOptionsItemSelectedแต่ผมย้ายรหัสลงใน นี้ช่วยให้ผมไม่เปิดเผยกับmDrawerToggle MainActivity
JJD

@JJD ฉันจำได้ว่าการดิ้นรนเล็กน้อยมีทุกอย่างที่ทำงานสำหรับ caret up สำหรับลำดับชั้นในแต่ละระดับ ตราบใดที่มันก็เหมาะกับคุณเช่นกัน แน่นอนว่าคุณสามารถย้ายรหัสไปที่อื่นเพื่อไม่ให้เปิดเผยได้
HpTerm

2

ฉันสร้างอินเทอร์เฟซสำหรับกิจกรรมการโฮสต์เพื่ออัปเดตสถานะมุมมองของเมนูแฮมเบอร์เกอร์ สำหรับชิ้นส่วนระดับบนสุดที่ผมตั้งสลับเพื่อtrueและชิ้นส่วนที่ฉันต้องการที่จะแสดงขึ้น <arrow falseผมตั้งสลับเพื่อ

public class SomeFragment extends Fragment {

    public interface OnFragmentInteractionListener {
        public void showDrawerToggle(boolean showDrawerToggle);
    }

    private OnFragmentInteractionListener mListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            this.mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        mListener.showDrawerToggle(false);
    }
}

จากนั้นในกิจกรรมของฉัน ...

public class MainActivity extends Activity implements SomeFragment.OnFragmentInteractionListener {

    private ActionBarDrawerToggle mDrawerToggle;

    public void showDrawerToggle(boolean showDrawerIndicator) {
        mDrawerToggle.setDrawerIndicatorEnabled(showDrawerIndicator);
    }

}

2

นี้คำตอบที่ได้ทำงาน แต่มีปัญหาเล็กน้อยกับมัน getSupportActionBar().setDisplayHomeAsUpEnabled(false)ไม่ได้เรียกว่าอย่างชัดเจนและมันก็ก่อให้เกิดไอคอนลิ้นชักถูกซ่อนไว้แม้กระทั่งเมื่อมีรายการใน backstack ไม่มีดังนั้นการเปลี่ยนsetActionBarArrowDependingOnFragmentsBackStack()วิธีการทำงานให้ฉัน

private void setActionBarArrowDependingOnFragmentsBackStack() {
        int backStackEntryCount = getSupportFragmentManager()
                .getBackStackEntryCount();
        // If there are no items in the back stack
        if (backStackEntryCount == 0) {
            // Please make sure that UP CARAT is Hidden otherwise Drawer icon
            // wont display
            getSupportActionBar().setDisplayHomeAsUpEnabled(false);
            // Display the Drawer Icon
            mDrawerToggle.setDrawerIndicatorEnabled(true);
        } else {
            // Show the Up carat
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            // Hide the Drawer Icon
            mDrawerToggle.setDrawerIndicatorEnabled(false);
        }

    }

ในโซลูชัน rigth ของฉันใช้เพียง actionBarDrawerToggle.setDrawerIndicatorEnabled (getSupportFragmentManager (). getBackStackEntryCount () <0);
Gorets

1

ลอจิกชัดเจน แสดงปุ่มย้อนกลับหากสแต็กหลังสแตกมีความชัดเจน แสดงภาพเคลื่อนไหววัสดุแฮมเบอร์เกอร์ด้านหลังหากสแต็กส่วนไม่ชัดเจน

getSupportFragmentManager().addOnBackStackChangedListener(
    new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            syncActionBarArrowState();
        }
    }
);


private void syncActionBarArrowState() {
    int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
    mNavigationDrawerFragment.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}

//add these in Your NavigationDrawer fragment class

public void setDrawerIndicatorEnabled(boolean flag){
    ActionBar actionBar = getActionBar();
    if (!flag) {
        mDrawerToggle.setDrawerIndicatorEnabled(false);
        actionBar.setDisplayHomeAsUpEnabled(true);
        mDrawerToggle.setHomeAsUpIndicator(getColoredArrow());
    } else {
        mDrawerToggle.setDrawerIndicatorEnabled(true);
    }
    mDrawerToggle.syncState();
    getActivity().supportInvalidateOptionsMenu();
}

//download back button from this(https://www.google.com/design/icons/) website and add to your project

private Drawable getColoredArrow() {
    Drawable arrowDrawable = ContextCompat.getDrawable(getActivity(), R.drawable.ic_arrow_back_black_24dp);
    Drawable wrapped = DrawableCompat.wrap(arrowDrawable);

    if (arrowDrawable != null && wrapped != null) {
        // This should avoid tinting all the arrows
        arrowDrawable.mutate();
        DrawableCompat.setTint(wrapped, Color.GRAY);
    }
    return wrapped;
}

1

ถ้าคุณดูที่แอป GMAIL และมาที่นี่เพื่อค้นหาไอคอน carret / affordance ..

ฉันขอให้คุณทำเช่นนี้ไม่มีคำตอบใดที่ชัดเจน ฉันสามารถแก้ไขคำตอบที่ยอมรับได้

  • NavigationDrawer -> Listview มี subfragments


  • subfragments จะถูกแสดงรายการเช่นนี้

  • firstFragment == ตำแหน่ง 0 ---> สิ่งนี้จะมี subfragments -> fragment

  • secondFragment
  • จัดเรียงที่สามและอื่น ๆ ....

ใน FirstFragment คุณมีแฟรกเมนต์อื่น

เรียกสิ่งนี้ว่า DrawerActivity

getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if (getFragmentManager().getBackStackEntryCount() > 0) {
                mDrawerToggle.setDrawerIndicatorEnabled(false);
            } else {
                mDrawerToggle.setDrawerIndicatorEnabled(true);
            }
        }
    });

และในส่วน

    setHasOptionsMenu(true);    

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Get item selected and deal with it
    switch (item.getItemId()) {
        case android.R.id.home:
            //called when the up affordance/carat in actionbar is pressed
            activity.onBackPressed();
            return true;
    }
    return false;
}

บนเมธอดกิจกรรม OnBackPressed Drawer ตั้งค่า drawer toggle เป็น true เพื่อเปิดใช้งานไอคอนรายการการนำทางอีกครั้ง

ขอบคุณ Pusp



0

IMO การใช้ onNavigateUp () (ดังแสดงที่นี่ ) ในโซลูชันของ riwnodennyk หรือ Tom นั้นสะอาดและดูเหมือนว่าจะทำงานได้ดีขึ้น เพียงแทนที่รหัส onOptionsItemSelected ด้วยสิ่งนี้:

@Override
public boolean onSupportNavigateUp() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        // handle up navigation
        return true;
    } else {
        return super.onSupportNavigateUp();
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.