Только что проверил, как сделать меню с DrawerLayout здесь. Но левое меню перемещается по главному содержимому. Как я могу установить его в меню, а основной контент перемещается бок о бок (меню нажимает содержимое вправо)?
Как перемещать основной контент с помощью Layer Layout слева
Ответ 1
Если вы не хотите использовать сторонние библиотеки, вы можете реализовать его самостоятельно, просто переопределив onDrawerSlide из ActionBarDrawerToggle. Там вы можете перевести представление framelayout на основе открытия% вашего ящика.
Пример с кодом:
<?xml version="1.0" encoding="utf-8"?>
<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">
<FrameLayout android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<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.support.v4.widget.DrawerLayout>
И здесь, переопределить onDrawerSlide:
public class ConfigurerActivity extends ActionBarActivity
{
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private FrameLayout frame;
private float lastTranslate = 0.0f;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
frame = (FrameLayout) findViewById(R.id.content_frame);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.acc_drawer_open, R.string.acc_drawer_close)
{
@SuppressLint("NewApi")
public void onDrawerSlide(View drawerView, float slideOffset)
{
super.onDrawerSlide(drawerView, slideOffset);
float moveFactor = (mDrawerList.getWidth() * slideOffset);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
frame.setTranslationX(moveFactor);
}
else
{
TranslateAnimation anim = new TranslateAnimation(lastTranslate, moveFactor, 0.0f, 0.0f);
anim.setDuration(0);
anim.setFillAfter(true);
frame.startAnimation(anim);
lastTranslate = moveFactor;
}
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
// ... more of your code
}
}
Так как setTranslationX недоступен в версиях до сотовых Android, я управлял им с помощью TranslateAnimation для устройств с более низкой версией.
Надеюсь, что это поможет!
Ответ 2
Возможно, вы захотите использовать эту библиотеку Переключатель ящиков Я написал.
Я уверен, вы найдете ContentDisplaceDrawerToggle
удобным:
ContentDisplaceDrawerToggle mContentDisplaceToggle = new ContentDisplaceDrawerToggle(this, mDrawerLayout, R.id.content_frame);
mDrawerLayout.setDrawerListener(mContentDisplaceToggle);
ContentDisplaceDrawerToggle
делает именно то, что вы говорите. Он перемещает представление содержимого при вводе/выводе DrawerLayout
.
Если вы хотите комбинировать разные переключатели, вы можете использовать ActionBarToggleWrapper
или DrawerToggleWrapper
Параметры использования приведены в файле read me.
Ответ 3
Вот рабочий код...
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
mContainerFrame.setTranslationX(slideOffset * drawerView.getWidth());
mDrawerLayout.bringChildToFront(drawerView);
mDrawerLayout.requestLayout();
//below line used to remove shadow of drawer
mDrawerLayout.setScrimColor(Color.TRANSPARENT);
}//this method helps you to aside menu drawer
};
Ответ 4
OP получил ответ. Но для кого-то, кто хочет этого эффекта, можно использовать SlidingPaneLayout. Он предназначен для этой цели.
В файле XML:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SlidingPaneLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@id/mainFrame"
style="@style/MP.mainFrame" >
<!--****************************Right Pane ****************************-->
<LinearLayout style="@style/searchLayout">
<android.support.v4.widget.NestedScrollView style="@style/MP">
<LinearLayout style="@style/MP.verticalLinearLayout">
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</LinearLayout>
<!--****************************Right Pane ****************************-->
<!--****************************Left Pane ****************************-->
<FrameLayout style="@style/MP.mainLayout">
<LinearLayout android:id="@id/fragmentContainer" style="@style/MP.fragmentContainer"/>
<android.support.v7.widget.Toolbar style="@style/toolbar">
<ir.tooskar.excomponents.ExtendedTextView android:id="@id/appTitle" style="@style/WC.appTitle"/>
<ir.tooskar.excomponents.ExtendedTextView android:id="@id/appBarSearchIcon" style="@style/WC.appBarSearchIcon"/>
</android.support.v7.widget.Toolbar>
</FrameLayout> <!--****************************Left Pane ****************************-->
Есть две панели, справа и слева, склеиваются и, таким образом, перемещаются вместе. Для меня левая панель является главной панелью, а справа скрывается значок переключения, чтобы отобразить ее. (Вид с id appBarSearchIcon).
Помните, что существует одна группа просмотра с именем SlidingPaneLayout, которая имеет только двух дочерних элементов: Левая и Вправо. > .
И важная роль в деятельности:
slidingPaneLayout = (SlidingPaneLayout) findViewById(R.id.mainFrame);
// Sets a color for covering left pane(Main Pane)
slidingPaneLayout.setSliderFadeColor(ContextCompat.getColor(context, R.color.searchPaneFadeColor));
// The listener for Opening the Right pane(Hidden pane)
findViewById(R.id.appBarSearchIcon).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view){
slidingPaneLayout.openPane();
}
});
Закрытие правой панели выполняется с помощью API, так же как Navigation Drawer.
Ответ 5
Во втором макете
android:layout_gravity="start"