Cara menangani klik tombol menggunakan onClick XML dalam Fragmen

440

Sebelum Honeycomb (Android 3), setiap Kegiatan terdaftar untuk menangani klik tombol melalui onClicktag di Layout's XML:

android:onClick="myClickMethod"

Dalam metode itu Anda dapat menggunakan view.getId()dan pernyataan switch untuk melakukan logika tombol.

Dengan diperkenalkannya Honeycomb, saya memecah Aktivitas ini menjadi Fragmen yang dapat digunakan kembali di banyak Kegiatan yang berbeda. Sebagian besar perilaku tombol adalah Kegiatan independen, dan saya ingin kode berada di dalam file Fragmen tanpa menggunakan metode lama (pra 1.6) mendaftar OnClickListeneruntuk setiap tombol.

final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Perform action on click
    }
});

Masalahnya adalah bahwa ketika tata letak saya meningkat itu masih merupakan aktivitas hosting yang menerima klik tombol, bukan Fragmen individu. Apakah ada pendekatan yang baik untuk itu?

  • Daftarkan fragmen untuk menerima klik tombol?
  • Lewati acara klik dari Aktivitas ke fragmen yang dimilikinya?
smith324
sumber
1
Tidak bisakah Anda menangani pendaftaran pendengar di onCreate dari fragmen?
CL22
24
@ Jodes Ya, tapi saya tidak ingin harus menggunakan setOnClickListenerdan findViewByIduntuk setiap tombol, itu sebabnya onClickditambahkan, untuk membuat semuanya lebih sederhana.
smith324
4
Melihat jawaban yang diterima, saya pikir menggunakan setOnClickListener lebih longgar daripada menempel pada pendekatan XML onClick. Jika aktivitas harus 'meneruskan' setiap klik ke fragmen kanan, ini berarti bahwa kode harus berubah setiap kali fragmen ditambahkan. Menggunakan antarmuka untuk memisahkan dari kelas dasar fragmen tidak membantu. Jika fragmen mendaftar dengan tombol yang benar itu sendiri, aktivitas tetap agnostik yang merupakan IMO gaya yang lebih baik. Lihat juga jawaban dari Adorjan Princz.
Adriaan Koster
@ smith324 harus setuju dengan Adriaan untuk yang ini. Coba jawab Adorjan dan lihat apakah hidup tidak lebih baik setelah itu.
user1567453

Jawaban:

175

Anda bisa melakukan ini:

Aktivitas:

Fragment someFragment;    

//...onCreate etc instantiating your fragments

public void myClickMethod(View v) {
    someFragment.myClickMethod(v);
}

Pecahan:

public void myClickMethod(View v) {
    switch(v.getId()) {
        // Just like you were doing
    }
}    

Menanggapi @Ameen yang ingin kopling kurang sehingga Fragmen dapat digunakan kembali

Antarmuka:

public interface XmlClickable {
    void myClickMethod(View v);
}

Aktivitas:

XmlClickable someFragment;    

//...onCreate, etc. instantiating your fragments casting to your interface.
public void myClickMethod(View v) {
    someFragment.myClickMethod(v);
}

Pecahan:

public class SomeFragment implements XmlClickable {

//...onCreateView, etc.

@Override
public void myClickMethod(View v) {
    switch(v.getId()){
        // Just like you were doing
    }
}    
Blundell
sumber
52
Itulah yang saya lakukan sekarang pada dasarnya tetapi itu jauh lebih berantakan ketika Anda memiliki beberapa fragmen yang masing-masing perlu menerima peristiwa klik. Saya hanya diperburuk dengan fragmen pada umumnya karena paradigma telah larut di sekitar mereka.
smith324
128
Saya mengalami masalah yang sama, dan meskipun saya menghargai tanggapan Anda, ini bukan kode bersih dari sudut pandang rekayasa perangkat lunak. Kode ini menghasilkan aktivitas yang sangat erat dengan fragmen. Anda harus dapat menggunakan kembali fragmen yang sama di beberapa aktivitas tanpa aktivitas mengetahui detail implementasi dari fragmen tersebut.
Ameen
1
Seharusnya "switch (v.getId ()) {" dan bukan "switch (v.getid ()) {"
eb80
5
Alih-alih mendefinisikan Antarmuka Anda sendiri, Anda dapat menggunakan OnClickListener yang sudah ada seperti yang disebutkan oleh Euporie.
fr00tyl00p
1
Saya hampir menangis ketika saya membaca ini, itu BEGITU BANYAK BOILERPLATE ... Jawaban di bawah ini dari @AdorjanPrincz adalah cara untuk pergi.
Wjdavis5
603

Saya lebih suka menggunakan solusi berikut untuk menangani acara onClick. Ini berfungsi untuk Aktivitas dan Fragmen juga.

public class StartFragment extends Fragment implements OnClickListener{

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_start, container, false);

        Button b = (Button) v.findViewById(R.id.StartButton);
        b.setOnClickListener(this);
        return v;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.StartButton:

            ...

            break;
        }
    }
}
Adorjan Princz
sumber
9
Di onCreateView, saya mengulangi semua item turunan dari ViewGroup v dan mengatur onclicklistener untuk semua instance Button yang saya temukan. Ini jauh lebih baik daripada mengatur pendengar secara manual untuk semua tombol.
Seseorang
17
Terpilih. Ini membuat fragmen dapat digunakan kembali. Kalau tidak mengapa menggunakan fragmen?
boreas
44
Bukankah ini teknik yang sama dianjurkan oleh Pemrograman Windows kembali pada tahun 1987? Tidak perlu khawatir. Google bergerak cepat dan semuanya tentang produktivitas pengembang. Saya yakin itu tidak akan lama sampai penanganan acara sebagus 1991-eara Visual Basic.
Edward Brey
7
impor penyihir yang telah Anda gunakan untuk OnClickListener? Intellij menyarankan saya android.view.View.OnClickListener dan itu tidak bekerja: / (onClick tidak pernah berjalan)
Lucas Jota
4
@NathanOsman Saya pikir Pertanyaan terkait dengan xml onClick, jadi ans yang diterima memberikan solusi yang tepat.
Naveed Ahmad
29

Masalahnya saya pikir adalah pandangan masih aktivitas, bukan fragmen. Fragmen tidak memiliki tampilan independen sendiri dan terlampir pada tampilan aktivitas induk. Itulah sebabnya acara berakhir di Aktivitas, bukan fragmen. Sangat disayangkan, tapi saya pikir Anda akan memerlukan beberapa kode untuk membuat ini berfungsi.

Apa yang saya lakukan selama konversi hanyalah menambahkan pendengar klik yang memanggil pengendali acara lama.

contohnya:

final Button loginButton = (Button) view.findViewById(R.id.loginButton);
loginButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(final View v) {
        onLoginClicked(v);
    }
});
Brill Pappin
sumber
1
Terima kasih - Saya menggunakan ini dengan sedikit modifikasi karena saya meneruskan tampilan fragmen (mis., Hasil inflater.inflate (R.layout.my_fragment_xml_resource)) ke onLoginClicked () sehingga dapat mengakses sub-tampilan fragmen, seperti EditText, melalui view.findViewById () (Jika saya cukup melewati tampilan aktivitas, panggilan untuk view.findViewById (R.id.myfragmentwidget_id) mengembalikan nol).
Michael Nelson
Ini tidak berfungsi dengan API 21 di proyek saya. Adakah pemikiran tentang bagaimana menggunakan pendekatan ini?
Darth Coder
Kode dasarnya cantik, digunakan di hampir setiap aplikasi. Bisakah Anda menggambarkan apa yang terjadi pada Anda?
Brill Pappin
1
Buat jawaban saya atas jawaban ini untuk penjelasan tentang masalah yang terjadi karena tata letak fragmen melekat pada tampilan aktivitas.
fllo
25

Saya baru-baru ini memecahkan masalah ini tanpa harus menambahkan metode ke Aktivitas konteks atau harus mengimplementasikan OnClickListener. Saya tidak yakin apakah ini merupakan solusi "valid" juga, tetapi ia berfungsi.

Didasarkan pada: https://developer.android.com/tools/data-binding/guide.html#binding_events

Ini dapat dilakukan dengan binding data: Cukup tambahkan instance fragmen Anda sebagai variabel, maka Anda dapat menautkan metode apa pun dengan onClick.

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.testapp.fragments.CustomFragment">

    <data>
        <variable android:name="fragment" android:type="com.example.testapp.fragments.CustomFragment"/>
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_place_black_24dp"
            android:onClick="@{() -> fragment.buttonClicked()}"/>
    </LinearLayout>
</layout>

Dan kode tautan fragmen akan menjadi ...

public class CustomFragment extends Fragment {

    ...

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_person_profile, container, false);
        FragmentCustomBinding binding = DataBindingUtil.bind(view);
        binding.setFragment(this);
        return view;
    }

    ...

}
Aldo Canepa
sumber
1
Saya hanya punya perasaan, beberapa detail hilang karena saya tidak bisa mendapatkan solusi ini berfungsi
Tima
Mungkin Anda kehilangan sesuatu dari "Build Environment" dalam dokumentasi: developer.android.com/tools/data-binding/…
Aldo Canepa
@Aldo Untuk metode onClick dalam XML saya yakin Anda harus memiliki android: onClick = "@ {() -> fragment. ButtonClicked ()}" sebagai gantinya. Juga untuk orang lain, Anda harus mendeklarasikan fungsi buttonClicked () di dalam fragmen dan memasukkan logika Anda di dalamnya.
Hayk Nahapetyan
dalam xml seharusnyaandroid:name="fragment" android:type="com.example.testapp.fragments.CustomFragment"/>
COYG
1
Saya baru saja mencoba ini dan atribut namedan tag tidak boleh memiliki awalan. Mungkin ada tata letak Android versi lama yang memang membutuhkannya? typevariableandroid:
JohnnyLambada
6

ButterKnife mungkin merupakan solusi terbaik untuk masalah kekacauan ini. Ia menggunakan prosesor anotasi untuk menghasilkan kode boilerplate "metode lama".

Tetapi metode onClick masih dapat digunakan, dengan inflator khusus.

Cara Penggunaan

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup cnt, Bundle state) {
    inflater = FragmentInflatorFactory.inflatorFor(inflater, this);
    return inflater.inflate(R.layout.fragment_main, cnt, false);
}

Penerapan

public class FragmentInflatorFactory implements LayoutInflater.Factory {

    private static final int[] sWantedAttrs = { android.R.attr.onClick };

    private static final Method sOnCreateViewMethod;
    static {
        // We could duplicate its functionallity.. or just ignore its a protected method.
        try {
            Method method = LayoutInflater.class.getDeclaredMethod(
                    "onCreateView", String.class, AttributeSet.class);
            method.setAccessible(true);
            sOnCreateViewMethod = method;
        } catch (NoSuchMethodException e) {
            // Public API: Should not happen.
            throw new RuntimeException(e);
        }
    }

    private final LayoutInflater mInflator;
    private final Object mFragment;

    public FragmentInflatorFactory(LayoutInflater delegate, Object fragment) {
        if (delegate == null || fragment == null) {
            throw new NullPointerException();
        }
        mInflator = delegate;
        mFragment = fragment;
    }

    public static LayoutInflater inflatorFor(LayoutInflater original, Object fragment) {
        LayoutInflater inflator = original.cloneInContext(original.getContext());
        FragmentInflatorFactory factory = new FragmentInflatorFactory(inflator, fragment);
        inflator.setFactory(factory);
        return inflator;
    }

    @Override
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        if ("fragment".equals(name)) {
            // Let the Activity ("private factory") handle it
            return null;
        }

        View view = null;

        if (name.indexOf('.') == -1) {
            try {
                view = (View) sOnCreateViewMethod.invoke(mInflator, name, attrs);
            } catch (IllegalAccessException e) {
                throw new AssertionError(e);
            } catch (InvocationTargetException e) {
                if (e.getCause() instanceof ClassNotFoundException) {
                    return null;
                }
                throw new RuntimeException(e);
            }
        } else {
            try {
                view = mInflator.createView(name, null, attrs);
            } catch (ClassNotFoundException e) {
                return null;
            }
        }

        TypedArray a = context.obtainStyledAttributes(attrs, sWantedAttrs);
        String methodName = a.getString(0);
        a.recycle();

        if (methodName != null) {
            view.setOnClickListener(new FragmentClickListener(mFragment, methodName));
        }
        return view;
    }

    private static class FragmentClickListener implements OnClickListener {

        private final Object mFragment;
        private final String mMethodName;
        private Method mMethod;

        public FragmentClickListener(Object fragment, String methodName) {
            mFragment = fragment;
            mMethodName = methodName;
        }

        @Override
        public void onClick(View v) {
            if (mMethod == null) {
                Class<?> clazz = mFragment.getClass();
                try {
                    mMethod = clazz.getMethod(mMethodName, View.class);
                } catch (NoSuchMethodException e) {
                    throw new IllegalStateException(
                            "Cannot find public method " + mMethodName + "(View) on "
                                    + clazz + " for onClick");
                }
            }

            try {
                mMethod.invoke(mFragment, v);
            } catch (InvocationTargetException e) {
                throw new RuntimeException(e);
            } catch (IllegalAccessException e) {
                throw new AssertionError(e);
            }
        }
    }
}
sergio91pt
sumber
6

Saya lebih suka menggunakan penanganan klik dalam kode daripada menggunakan onClickatribut dalam XML ketika bekerja dengan fragmen.

Ini menjadi lebih mudah ketika memigrasi aktivitas Anda ke fragmen. Anda bisa memanggil handler klik (sebelumnya diatur ke android:onClickdalam XML) langsung dari setiap caseblok.

findViewById(R.id.button_login).setOnClickListener(clickListener);
...

OnClickListener clickListener = new OnClickListener() {
    @Override
    public void onClick(final View v) {
        switch(v.getId()) {
           case R.id.button_login:
              // Which is supposed to be called automatically in your
              // activity, which has now changed to a fragment.
              onLoginClick(v);
              break;

           case R.id.button_logout:
              ...
        }
    }
}

Dalam hal menangani klik dalam fragmen, ini terlihat lebih mudah bagi saya daripada android:onClick.

Ronnie
sumber
5

Ini adalah cara lain :

1. Buat BaseFragment seperti ini:

public abstract class BaseFragment extends Fragment implements OnClickListener

2.Gunakan

public class FragmentA extends BaseFragment 

dari pada

public class FragmentA extends Fragment

3. Dalam aktivitas Anda:

public class MainActivity extends ActionBarActivity implements OnClickListener

dan

BaseFragment fragment = new FragmentA;

public void onClick(View v){
    fragment.onClick(v);
}

Semoga ini bisa membantu.

Euporie
sumber
1 tahun, 1 bulan, dan 1 hari setelah jawaban Anda: Apakah ada alasan selain tidak mengulangi implementasi OnClickListener pada setiap kelas Fragmen untuk membuat BaseFragment abstrak?
Dimitrios K.
5

Dalam kasus penggunaan saya, saya memiliki 50 ImageViews aneh yang saya perlukan untuk menghubungkan ke metode onClick tunggal. Solusi saya adalah untuk mengulangi pandangan di dalam fragmen dan mengatur pendengar onclick yang sama pada masing-masing:

    final View.OnClickListener imageOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            chosenImage = ((ImageButton)v).getDrawable();
        }
    };

    ViewGroup root = (ViewGroup) getView().findViewById(R.id.imagesParentView);
    int childViewCount = root.getChildCount();
    for (int i=0; i < childViewCount; i++){
        View image = root.getChildAt(i);
        if (image instanceof ImageButton) {
            ((ImageButton)image).setOnClickListener(imageOnClickListener);
        }
    }
Chris Knight
sumber
2

Ketika saya melihat jawaban mereka sudah tua. Baru-baru ini Google memperkenalkan DataBinding yang jauh lebih mudah ditangani onClick atau penetapan dalam xml Anda.

Ini adalah contoh bagus yang bisa Anda lihat bagaimana menangani ini:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="handlers" type="com.example.Handlers"/>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
           android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"
           android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/>
   </LinearLayout>
</layout>

Ada juga tutorial yang sangat bagus tentang DataBinding yang dapat Anda temukan di Sini .

Amir
sumber
2

Anda dapat menetapkan panggilan balik sebagai atribut dari tata letak XML Anda. Artikel Atribut XML Kustom untuk Widget Android Kustom Anda akan menunjukkan kepada Anda bagaimana melakukannya untuk widget khusus. Penghargaan untuk Kevin Dion :)

Saya sedang menyelidiki apakah saya dapat menambahkan atribut gaya ke kelas Fragmen dasar.

Ide dasarnya adalah untuk memiliki fungsionalitas yang sama dengan implementasi Lihat ketika berhadapan dengan panggilan balik onClick.

Nelson Ramirez
sumber
1

Menambahkan ke jawaban Blundell,
Jika Anda memiliki lebih banyak fragmen, dengan banyak onClicks:

Aktivitas:

Fragment someFragment1 = (Fragment)getFragmentManager().findFragmentByTag("someFragment1 "); 
Fragment someFragment2 = (Fragment)getFragmentManager().findFragmentByTag("someFragment2 "); 
Fragment someFragment3 = (Fragment)getFragmentManager().findFragmentByTag("someFragment3 "); 

...onCreate etc instantiating your fragments

public void myClickMethod(View v){
  if (someFragment1.isVisible()) {
       someFragment1.myClickMethod(v);
  }else if(someFragment2.isVisible()){
       someFragment2.myClickMethod(v);
  }else if(someFragment3.isVisible()){
       someFragment3.myClickMethod(v); 
  }

} 

Dalam Fragmen Anda:

  public void myClickMethod(View v){
     switch(v.getid()){
       // Just like you were doing
     }
  } 
amalBit
sumber
1

Jika Anda mendaftar di xml menggunakan android: Onclick = "", panggilan balik akan diberikan ke Aktivitas yang dihormati di bawah konteks mana fragmen Anda berada (getActivity ()). Jika metode seperti itu tidak ditemukan dalam Kegiatan, maka sistem akan mengeluarkan pengecualian.

Isham
sumber
terima kasih, tidak ada yang menjelaskan mengapa kecelakaan itu terjadi
1

Anda mungkin ingin mempertimbangkan untuk menggunakan EventBus untuk acara yang dipisahkan. Anda dapat mendengarkan acara dengan sangat mudah. Anda juga dapat memastikan acara tersebut diterima di utas ui (alih-alih memanggil runOnUiThread .. untuk Anda sendiri untuk setiap langganan acara)

https://github.com/greenrobot/EventBus

dari Github:

Bus peristiwa yang dioptimalkan untuk Android yang menyederhanakan komunikasi antara Aktivitas, Fragmen, Utas, Layanan, dll. Lebih sedikit kode, kualitas lebih baik

programmer
sumber
1

Saya ingin menambahkan jawaban Adjorn Linkz .

Jika Anda membutuhkan beberapa penangan, Anda bisa menggunakan referensi lambda

void onViewCreated(View view, Bundle savedInstanceState)
{
    view.setOnClickListener(this::handler);
}
void handler(View v)
{
    ...
}

Kuncinya di sini adalah handlertanda tangan metode yang cocok dengan View.OnClickListener.onClicktanda tangan. Dengan cara ini, Anda tidak perlu View.OnClickListenerantarmuka.

Selain itu, Anda tidak memerlukan pernyataan peralihan.

Sayangnya, metode ini hanya terbatas pada antarmuka yang memerlukan metode tunggal, atau lambda.

Dragas
sumber
1

Meskipun saya telah melihat beberapa jawaban yang bagus bergantung pada pengikatan data, saya tidak melihat ada yang sepenuhnya dengan pendekatan itu - dalam arti memungkinkan resolusi fragmen sambil memungkinkan untuk definisi tata letak fragmen-bebas dalam XML.

Sehingga data asumsi mengikat yang diaktifkan, inilah solusi generik saya dapat mengusulkan; Agak panjang tapi pasti berhasil (dengan beberapa peringatan):

Langkah 1: Implementasi OnClick Kustom

Ini akan menjalankan pencarian yang sadar akan fragmen melalui konteks yang terkait dengan tampilan yang disadap (mis. Tombol):


// CustomOnClick.kt

@file:JvmName("CustomOnClick")

package com.example

import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import java.lang.reflect.Method

fun onClick(view: View, methodName: String) {
    resolveOnClickInvocation(view, methodName)?.invoke(view)
}

private data class OnClickInvocation(val obj: Any, val method: Method) {
    fun invoke(view: View) {
        method.invoke(obj, view)
    }
}

private fun resolveOnClickInvocation(view: View, methodName: String): OnClickInvocation? =
    searchContexts(view) { context ->
        var invocation: OnClickInvocation? = null
        if (context is Activity) {
            val activity = context as? FragmentActivity
                    ?: throw IllegalStateException("A non-FragmentActivity is not supported (looking up an onClick handler of $view)")

            invocation = getTopFragment(activity)?.let { fragment ->
                resolveInvocation(fragment, methodName)
            }?: resolveInvocation(context, methodName)
        }
        invocation
    }

private fun getTopFragment(activity: FragmentActivity): Fragment? {
    val fragments = activity.supportFragmentManager.fragments
    return if (fragments.isEmpty()) null else fragments.last()
}

private fun resolveInvocation(target: Any, methodName: String): OnClickInvocation? =
    try {
        val method = target.javaClass.getMethod(methodName, View::class.java)
        OnClickInvocation(target, method)
    } catch (e: NoSuchMethodException) {
        null
    }

private fun <T: Any> searchContexts(view: View, matcher: (context: Context) -> T?): T? {
    var context = view.context
    while (context != null && context is ContextWrapper) {
        val result = matcher(context)
        if (result == null) {
            context = context.baseContext
        } else {
            return result
        }
    }
    return null
}

Catatan: secara longgar didasarkan pada implementasi Android asli (lihat https://android.googlesource.com/platform/frameworks/base/+/a175a5b/core/java/android/view/View.java#3025 )

Langkah 2: Aplikasi deklaratif dalam file tata letak

Kemudian, dalam XML sadar data-binding:

<layout>
  <data>
     <import type="com.example.CustomOnClick"/>
  </data>

  <Button
    android:onClick='@{(v) -> CustomOnClick.onClick(v, "myClickMethod")}'
  </Button>
</layout>

Peringatan

  • Mengasumsikan FragmentActivityimplementasi berbasis 'modern'
  • Hanya dapat mencari metode fragmen "teratas" (yaitu yang terakhir ) dalam tumpukan (meskipun itu dapat diperbaiki, jika perlu)
d4vidi
sumber
0

Ini bekerja untuk saya: (Android studio)

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.update_credential, container, false);
        Button bt_login = (Button) rootView.findViewById(R.id.btnSend);

        bt_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                System.out.println("Hi its me");


            }// end onClick
        });

        return rootView;

    }// end onCreateView
Vinod Joshi
sumber
1
Ini menggandakan jawaban @Brill Pappin .
naXa
0

IMHO solusi terbaik:

dalam fragmen:

protected void addClick(int id) {
    try {
        getView().findViewById(id).setOnClickListener(this);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void onClick(View v) {
    if (v.getId()==R.id.myButton) {
        onMyButtonClick(v);
    }
}

kemudian di onViewStateRestored dari Fragment:

addClick(R.id.myButton);
pengguna4806368
sumber
0

Aktivitas Anda menerima panggilan balik seperti yang harus digunakan:

mViewPagerCloth.setOnClickListener((YourActivityName)getActivity());

Jika Anda ingin fragmen Anda menerima panggilan balik maka lakukan ini:

mViewPagerCloth.setOnClickListener(this);

dan mengimplementasikan onClickListenerantarmuka pada Fragment

ColdFusion
sumber