2016-06-29 7 views
0

Wenn eine benutzerdefinierte Komponente für Android zu machen, soweit ich verstanden, ich brauche:hinzufügen setOnClickListener auf Android benutzerdefinierte Komponente

  • eine XML-Datei mit dem Layout für die Komponente;
  • eine Java-Klasse.

Versucht, einen zu machen, nur für die Praxis. Verwenden Sie zwei Fortschrittsbalken und eine Schaltfläche in der XML, und erstellen Sie die Klasse, als in meiner Haupttätigkeit ausprobiert, hat gut funktioniert.

Aber jetzt locke ich, wie OnClickListener auf meiner Schaltfläche durch die Aktivität festgelegt, und in diesem Teil bin ich verloren.

Mein loading_button.xml:

<merge 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"> 

<RelativeLayout 
    android:orientation="vertical" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <ProgressBar 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="match_parent" 
     android:layout_height="4dp" 
     android:progress="0" 
     android:id="@+id/pg_top" /> 

    <Button 
     android:text="Button" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/btn_ok" 
     android:background="@color/colorPrimary" 
     android:textColor="#ffffff" 
     android:layout_below="@+id/pg_top" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

    <ProgressBar 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="match_parent" 
     android:layout_height="5dp" 
     android:progress="0" 
     android:id="@+id/pg_bottom" 
     android:layout_below="@+id/btn_ok" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

</RelativeLayout> 

</merge> 

Hier die LoadingButton.java:

public class LoadingButton extends RelativeLayout{ 

private ProgressBar pbTop; 
private ProgressBar pbBottom; 
private Button btnOk; 

private int pbTopProgress = 0; 
private int pbBottomProgress = 0; 

public LoadingButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    View view = View.inflate(context, R.layout.loading_button, this); 

    btnOk = (Button) view.findViewById(R.id.btn_ok); 
    pbTop = (ProgressBar) view.findViewById(R.id.pg_top); 
    pbBottom = (ProgressBar) view.findViewById(R.id.pg_bottom); 

    btnOk.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Doing stuff ok 
     } 
    }); 

}// LoadingButton 
} 

Die setOnClickListener in der Klasse funktioniert, aber wie kann ich es aus meiner Haupttätigkeit eingestellt?

MainActivity:

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // My new component (it's id in activity_main.xml is 'lb') 
    LoadingButton lb = (LoadingButton) findViewById(R.id.lb); 

    // QUESTION - how to make something like this with btnOk: 
    lb.btnOkSetOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Do stuff 
     } 
    }); 
    } 
} 

Wenn dies möglich ist, wie?

Falls nicht, was ist der richtige Ansatz, um eine benutzerdefinierte Komponente zu erstellen und clickListeners auf ein bestimmtes Element dieser Komponente zu setzen?

Antwort

1

Der beste Ansatz, um alle Ansichten zu bearbeiten, klicken Sie in LoadingButton (für benutzerdefinierte Ansicht). Und erstellen Sie eine Schnittstelle.

public class LoadingButton extends RelativeLayout { 


    public interface OnLoadingButtonClickListener{ 
     void onLoadingButtonClickListener(); 
    } 

    private ProgressBar pbTop; 
    private ProgressBar pbBottom; 
    private Button btnOk; 

    private int pbTopProgress = 0; 
    private int pbBottomProgress = 0; 
    private OnLoadingButtonClickListener mONOnLoadingButtonClickListener; 

    public LoadingButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     View view = View.inflate(context, R.layout.loading_button, this); 

     btnOk = (Button) view.findViewById(R.id.btn_ok); 
     pbTop = (ProgressBar) view.findViewById(R.id.pg_top); 
     pbBottom = (ProgressBar) view.findViewById(R.id.pg_bottom); 

     btnOk.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(mONOnLoadingButtonClickListener != null){ 
        mONOnLoadingButtonClickListener.onLoadingButtonClickListener(); 
       } 
      } 
     }); 

    }// LoadingButton 

    public void setOnLoadingClickListener(OnLoadingButtonClickListener onLoadingClickListener){ 
     mONOnLoadingButtonClickListener = onLoadingClickListener; 
    } 


} 

Und implementieren Sie OnLoadingButtonClickListener in Ihrer Aktivität.

public class MainActivity extends AppCompatActivity implements LoadingButton.OnLoadingButtonClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // My new component (it's id in activity_main.xml is 'lb') 
     LoadingButton lb = (LoadingButton) findViewById(R.id.lb); 
     lb.setOnLoadingClickListener(this); 

    } 

    @Override 
    public void onLoadingButtonClickListener() { 
     //do your stuff on ok button click 
    } 
} 
+0

Genau was ich wollte! Vielen Dank. Aber du hast einen kleinen Fehler in setOnLoadingClickListener, sollte sein: public void setOnLoadingClickListener (OnLoadingButtonClickListener onLoadingClickListener) { mONOnLoadingButtonClickListener = onLoadingClickListener; } Nur Renema den zweiten mONOnLoadingButtonClickListener zu onLoadingClickListener und ich werde als die Antwort markieren ^^ –

+0

OK, danke zu finden mein Mistak – USKMobility

0

Überschreiben Sie setOnClickListener(OnClickListener listener) in Ihrer benutzerdefinierten Java-Klasse. Darin schreiben Sie:

btnOk.setOnClickListener (Listener);

Dabei ist Listener ein Argument der benutzerdefinierten Funktion setOnClickListener().

Das macht Ihre gesamte Ansicht anklickbar und klicken Sie auf Ihre Schaltfläche wird ausgeführt. Fügen Sie dem Stammlayout Ihrer benutzerdefinierten Ansicht android:clickable="true" hinzu.

Verwandte Themen