Try:
FrameLayout root = (FrameLayout) findViewById(R.id.yourID);
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)root.getLayoutParams();
params.setMargins(left, top, right, bottom);
root.setLayoutParams(params);
Question
I have a navigation drawer, but I want to set some margins, just like setting android:layout_marginTop="72dp"
in the XML file, but I want to set them programmatically.
My activity_main.xml:
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fitsSystemWindows="false"
android:background="@drawable/back_blue_translucent"
xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false"
tools:context="com.bentleycarr.mentalmaths.MainActivity">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9f9f9"/>
<fragment android:id="@+id/navigation_drawer"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:layout_marginTop="72dp" <!--I want to change this -->
android:name="com.bentleycarr.mentalmaths.NavigationDrawerFragment" />
</android.support.v4.widget.DrawerLayout>
</FrameLayout>
Above, where it says android:layout_marginTop="72dp"
- I want to change 'that' to another number in MainActivity.java but I can only find info on how to do this to a LinearLayout or a RelativeLayout etc, not to a <fragment android:id="@+id/navigation_drawer"
Any help/advice would be greatly appreciated.
I tried Aashir's answer but it crashed. Here's the log: (Ignore this for now - I might have added the wrong ID.)
Process: com.bentleycarr.mentalmaths, PID: 23729
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bentleycarr.mentalmaths/com.bentleycarr.mentalmaths.MainActivity}: java.lang.ClassCastException: android.support.v4.widget.DrawerLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassCastException: android.support.v4.widget.DrawerLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams
at com.bentleycarr.mentalmaths.MainActivity.onCreate(MainActivity.java:55)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
Solution
Try:
FrameLayout root = (FrameLayout) findViewById(R.id.yourID);
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)root.getLayoutParams();
params.setMargins(left, top, right, bottom);
root.setLayoutParams(params);
OTHER TIPS
I had a task to set margin for exact size from screen border (left/right side), so I overrided default generateLayoutParams(attrs)
in Drawer Layout to resize its viewPort:
public class CustomMarginDrawerLayout extends DrawerLayout {
private static final int DRAWER_MARGIN_IN_DP = 48;
private final Context context;
public CustomMarginDrawerLayout(Context context) {
super(context);
this.context = context;
}
public CustomMarginDrawerLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public CustomMarginDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}
@Override
public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
ViewGroup.LayoutParams params = super.generateLayoutParams(attrs);
int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DRAWER_MARGIN_IN_DP, getResources().getDisplayMetrics());
params.width = getScreenWidth(context) - margin;
return params;
}
private int getScreenWidth(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(metrics);
return metrics.widthPixels;
}
}