2017-12-26 5 views
1

Ich möchte die Position von Floating-Aktion-Schaltfläche programmgesteuert an einer bestimmten Stelle in einem Fragment verschieben, da manchmal die Floating-Aktion den wichtigen Inhalt dieses Fragments abdeckt. Ich habe die Referenz der schwebenden Aktionsschaltfläche in der Aktivität und speicherte sie in einer statischen Variable. Ich versuche, die Schwerkraft in der onResume-Methode des Fragments zu ändern. Wie Sie in dem Bild sehen können, dass fab die y-Achse abdeckt, möchte ich es zum Ende bewegen. Image for the reference.Android: Wie setzt man die Schwerkraft von Floating Action Button programmatisch?

Der Code in der onResume Methode des Fragments (nicht funktioniert):

override fun onResume() { 
    super.onResume() 
    val params : CoordinatorLayout.LayoutParams = BaseActivity.fab!!.layoutParams as CoordinatorLayout.LayoutParams 
    params.anchorGravity = GravityCompat.END 
    BaseActivity.fab!!.layoutParams = params 
} 

XML-Datei der Haupttätigkeit

<?xml version="1.0" encoding="utf-8"?> 
<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" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="com.example.mandar.hackerthon_app.Activities.BaseActivity" 
    tools:showIn="@layout/app_bar_base"> 

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

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 

     android:layout_margin="20dp" 
     android:scaleType="center" 
     android:elevation="10dp" 
     app:backgroundTint="@color/common_google_signin_btn_text_dark_default" 
     app:srcCompat="@mipmap/ic_connection_on_round" /> 

</android.support.design.widget.CoordinatorLayout> 
+0

Versuchen Sie 'View # requestLayout' aufzurufen, nachdem Sie die Layoutparameter festgelegt haben. – kernelmaster

Antwort

0

In der XML-Datei, fügen Sie die app:layout_anchor Eigenschaft für FloatingActionButton, wie layout_anchorGravity wird nur berücksichtigt, wenn Sie eine Ankeransicht angeben.

In Ihrem Fall kann dieser Anker @id/frameBaseFragment sein. Beachten Sie, dass Sie den Wert layoutGravity stattdessen ändern können, wenn Sie FloatingActionButton an das untere Ende seines übergeordneten Elements CoordinatorLayout verschieben möchten.

Es wird auch dringend davon abgeraten, Verweise auf Ansichten in statischen Variablen zu speichern, da dies verhindert, dass das zugehörige Activity als Müll gesammelt wird, was zu großen Speicherlecks führt. Dies könnte auch die Ursache Ihres Problems sein.

+0

Vielen Dank für die Hilfe. Es hat funktioniert. Und über Ihren Vorschlag, gibt es eine effiziente Möglichkeit, den Verweis auf Elemente der Aktivität in das Fragment zu bekommen? –

+0

Behalten Sie eine Referenz der Ansichten als _instance_ Variablen (oder Felder) Ihrer Aktivität. Sie können einen Verweis auf eine bestimmte Ansicht mit 'findViewById' in' onCreate' abrufen und dann diese Variable in 'onResume' oder einer anderen Methode verwenden. –

+0

Als Anfänger ist die Berücksichtigung von Dingen wie Speicherlecks in meiner täglichen Programmierpraxis nicht selbstverständlich. Danke für eine Anleitung :) –

Verwandte Themen