2016-03-20 11 views
2

Ich möchte schwebende Schaltfläche zeigen, wenn der Benutzer Option aus der ListView auswählt. Bei den ausgewählten Elementen sollte die schwebende Schaltfläche angezeigt werden, andernfalls sollte die schwebende Schaltfläche ausgeblendet sein. Hier ist der Code, den ich die Arbeit mitNullPointerException on setLayoutParams FloatingButton

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
      fab.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        // Click action 
        ParseObject message = createMessage(); 
        if (message == null) { 
         // error 
         AlertDialog.Builder builder = new AlertDialog.Builder(RecipientsActivity.this); 
         builder.setMessage(R.string.error_selecting_file) 
           .setTitle(R.string.error_selecting_file_title) 
           .setPositiveButton(android.R.string.ok, null); 
         AlertDialog dialog = builder.create(); 
         dialog.show(); 
        } 
        else { 
         send(message); 
         finish(); 
        } 
       } 
      }); 

@Override 
      protected void onListItemClick(ListView l, View v, int position, long id) { 
       super.onListItemClick(l, v, position, id); 

       if (l.getCheckedItemCount() > 0) { 
        CoordinatorLayout.LayoutParams p = new CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.WRAP_CONTENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT); 
        p.anchorGravity = Gravity.BOTTOM | Gravity.END; 
        p.setAnchorId(R.id.colayout); 
        fab.setLayoutParams(p); 
        fab.setVisibility(View.VISIBLE); 
       } 

      } 

Hier wird das Layout Ressourcendatei

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/colayout" 
    tools:context=".RecipientsActivity" > 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" > 
    </ListView> 

    <TextView 
     android:id="@android:id/empty" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/empty_recipients_list_message" /> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|center" 
     android:visibility="gone" 
     android:clickable="true" 
     android:src="@drawable/ic_checkbox_marked_circle_outline_white_48dp" /> 

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

Hier ist die Logcat

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.FloatingActionButton.setLayoutParams(android.view.ViewGroup$LayoutParams)' on a null object reference 
                       at com.teamtreehouse.ribbit.RecipientsActivity.onListItemClick(RecipientsActivity.java:129) 
                       at android.app.ListActivity$2.onItemClick(ListActivity.java:319) 
                       at android.widget.AdapterView.performItemClick(AdapterView.java:310) 
                       at android.widget.AbsListView.performItemClick(AbsListView.java:1214) 


     at 
+0

Ihr Fab-Widget ist null, fügen Sie bitte den Instanziierungscode dafür hinzu – thepoosh

+0

Wie füge ich Instanziierungscode hinzu? – Savita

+0

@thepoosh Ich habe den Code über – Savita

Antwort

3

Sie benötigen eine Floating-Aktionstaste gloablly instanziiert. Sie instanziieren es nicht global

Sie sollten außerhalb Ihres onCreate FloatingActionButton fab; als global deklarieren und dann

fab = (FloatingActionButton) findViewById(R.id.fab); 
fab.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // Click action 
     ParseObject message = createMessage(); 
     if (message == null) { 
      // error 
      AlertDialog.Builder builder = new AlertDialog.Builder(RecipientsActivity.this); 
      builder.setMessage(R.string.error_selecting_file) 
        .setTitle(R.string.error_selecting_file_title) 
        .setPositiveButton(android.R.string.ok, null); 
      AlertDialog dialog = builder.create(); 
      dialog.show(); 
     } 
     else { 
      send(message); 
      finish(); 
     } 
    } 
}); 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    if (l.getCheckedItemCount() > 0) { 
     CoordinatorLayout.LayoutParams p = new CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.WRAP_CONTENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT); 
     p.anchorGravity = Gravity.BOTTOM | Gravity.END; 
     p.setAnchorId(R.id.colayout); 
     fab.setLayoutParams(p); 
     fab.setVisibility(View.VISIBLE); 
    } 

} 
0

Ich kann Ihre fab Widget überall im Code
Vielleicht ist es instanziiert müssen Sie nicht sehen erste

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.your_fab_id); 

UPDATE:
Sie müssen die Art und Weise Sie erklärt die LayoutParams

CoordinatorLayout.LayoutParams p = (CoordinatorLayout.LayoutParams) fab.getLayoutParams(); 
    p.anchorGravity = Gravity.BOTTOM | Gravity.END; 
    p.setAnchorId(R.id.colayout); 
    fab.setLayoutParams(p); 
    fab.setVisibility(View.VISIBLE); 
+0

Ich habe bereits hinzugefügt, dass – Savita

2

Die einfache Antwort bearbeiten. Ersetzen Sie diese Zeile:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 

mit dieser Zeile:

fab = (FloatingActionButton) findViewById(R.id.fab);//remove FloatingActionButton 

und fügen Sie eine globale Variable am Anfang Ihrer Klasse:

class your_class { 
    FloatingActionButton fab;//define as global variable 

Grund: Sie verwendet, um die lokale Variable fab.

+0

Ich habe das gleiche Problem auch, und lösen Sie es mit Ihrer Antwort. Aber warum passiert es? –