2015-12-21 51 views
3

我在我的應用程序中有10個不同的片段。我需要將導航抽屜(抽屜佈局)隱藏在少數片段中,如何從片段訪問抽屜佈局並隱藏它?我知道我們需要在活動mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);中使用,但如何在碎片中完成它?如何從片段中禁用或隱藏抽屜佈局Android

回答

6

你可以做這樣的事情在你的片段:

private MainActivity main; 

@Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     main = (MainActivity) activity; 
    } 

你一定要避免這種情況!

mutch更好的解決方案將使用一個接口在您的Main和片段之間進行通信。你最終會像這樣的東西:

public interface MyInterface { 
public void lockDrawer(); 
public void unlockDrawer(); 
} 

主營:

public class DetailViewActivity extends AppCompatActivity implements MyInterface { 
@Override 
    public void lockDrawer() {   
     mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
    } 

@Override 
    public void unlockDrawer() { 
    mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
    } 

} 

片段:

public class MyFragment extends Fragment { 
    private MyInterface myInterface; 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     myInterface.lockDrawer(); 
     return inflater.inflate(R.layout.example_fragment, container, false); 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     myInterface.unlockDrawer(); 
    } 

} 

爲什麼這是最好的解決辦法:如果你做這樣的事情((HomeActivity)毫無疑問),你將無法重複使用你的片段。 將會有一個ClassCastException。爲了重用你的Fragment,你應該使用一個接口,而不是投你MainActivity。因此,每個使用 的活動都可以簡單地實現此界面。即使沒有DrawerLayout,你也可以使用它。所以最大的努力就是可重用性。

寫你的活動中,如下所示一個公共方法 - -

public void enableDisableDrawer(int mode) { 
    if (mDrawerLayout != null) { 
     mDrawerLayout.setDrawerLockMode(mode); 
    } 
} 

,然後裏面片段的onResume,你可以調用這個和改變抽屜鎖模式需要

+0

謝謝你。它的工作完美。 – sivaprakash

1

您可以使用此方法鎖定或解鎖抽屜:DrawerLayout.setDrawerLockMode(...)。 (此方法還有另外兩個版本,用於指定特定抽屜的鎖定模式。)要鎖定,請使用DrawerLayout.LOCK_MODE_LOCKED_CLOSED;解鎖,使用DrawerLayout.LOCK_MODE_UNLOCKED

如果您使用的是ActionBarDrawerToggle,則需要添加一些額外的代碼,以防止在您鎖定抽屜時單擊ActionBarDrawerToggle時打開抽屜。

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // check lock mode before passing to ActionBarDrawerToggle 
    // I assume your drawer is on the left; if not, use Gravity.RIGHT 
    int lockMode = mDrawer.getDrawerLockMode(Gravity.LEFT); 
    if (lockMode == DrawerLayout.LOCK_MODE_UNLOCKED && 
      mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    // Handle your other action bar items... 

    return super.onOptionsItemSelected(item); 
} 

參考鏈接瞭解更多信息link here

+0

我知道這一點。我的問題是,我怎樣才能從活動訪問它的形式片段。 –

1

創建您的活動兩種方法。一個用於打開抽屜,另一個用於關閉抽屜。見下面的代碼。

​​3210

現在打電話從片段上述方法類似下面

((MainActivity)getActivity()).closeNavigationDrawer(); // to close drawer 
((MainActivity)getActivity()).openNavigationDrawer(); // to open drawer 
((MainActivity)getActivity()).lockNavigationDrawer(); // to lock drawer 
((MainActivity)getActivity()).unLockNavigationDrawer(); // to unlock drawer 
+0

這將工作。也沒有好的做法 - 活動和片段之間的溝通,你應該總是使用一個接口 –

5

您可以通過以下方式做到這一點 -

((HomeActivity) mActivity).enableDisableDrawer(DrawerLayout.LOCK_MODE_UNLOCKED); 

OR

((HomeActivity) mActivity).enableDisableDrawer(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 

其中mActivity是我的活動參考。

這種方式正在爲我工​​作。

+0

我不會推薦這個原因 - 你以這種方式失去了碎片的可重用性 –

0

您可以使用此方法來鎖定或解鎖抽屜:DrawerLayout.setDrawerLockMode(...)。 (此方法還有另外兩個版本,用於指定特定抽屜的鎖定模式。)要鎖定,請使用DrawerLayout.LOCK_MODE_LOCKED_CLOSED;要解鎖,請使用DrawerLayout.LOCK_MODE_UNLOCKED。

如果您使用的是ActionBarDrawerToggle,則需要添加一些額外的代碼,以防止在您鎖定抽屜時單擊ActionBarDrawerToggle時打開抽屜。

enter code here 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// check lock mode before passing to ActionBarDrawerToggle 
// I assume your drawer is on the left; if not, use Gravity.RIGHT 
int lockMode = mDrawer.getDrawerLockMode(Gravity.LEFT); 
if (lockMode == DrawerLayout.LOCK_MODE_UNLOCKED && 
     mDrawerToggle.onOptionsItemSelected(item)) { 
    return true; 
} 
// Handle your other action bar items... 

return super.onOptionsItemSelected(item); 
} 
相關問題