简体   繁体   中英

Button not working on Android Fragment

I have a simple Button on a Fragment, the button is well declared, but when I press the button on the app, nothing happends.

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    Log.i(TAG, "onCreate");

    View rootView = inflater.inflate(R.layout.activity_cliente, container, false);

    metIP = (EditText) rootView.findViewById(R.id.etIP);
    mtvRespuesta = (TextView) rootView.findViewById(R.id.tvRespuesta);
    mbtConectar = (Button) rootView.findViewById(R.id.btConectar);
    metPuerto = (EditText) rootView.findViewById(R.id.etPuerto);


    // contexto de la aplicacion
    cont = super.getActivity().getApplicationContext();
    // connectivityManager
    myConnManager = (ConnectivityManager) super.getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
    // broadcastReceiver de las conexiones WiFi, registro del mismo dentro
    // de la aplicacion
    BroadcastReceiverWifi brwifi = new BroadcastReceiverWifi(this,
            myConnManager);
    super.getActivity().registerReceiver(brwifi.myWifiReciever, new IntentFilter(
            ConnectivityManager.CONNECTIVITY_ACTION));

    mbtConectar.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i(TAG,"dentro de onClick");
            eventoConectar(v);
        }
    });

    return rootView;
}

complete xml code, where the button is declared. called activity_cliente.xml

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent">
<TableLayout
    android:id="@+id/TableLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.daviddiez.clientearduinotab.ClienteActivity" >

    <!-- fila para campo de IP con su etiqueta -->

    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tvIP"
        android:layout_width="30dp"
        android:fontFamily="sans-serif-condensed"
        android:gravity="left"
        android:text="@string/tvIP"
        android:textColor="#1534e3"
        android:textSize="22sp"/>

    <EditText
        android:id="@+id/etIP"
        android:layout_width="150dp"
        android:fontFamily="sans-serif-condensed"
        android:gravity="left"
        android:hint="dir ip"
        android:inputType="text"
        android:singleLine="true"
        android:textColor="#008caf"
        android:textSize="20sp" />
</TableRow>

<!-- fila para el puerto -->

<TableRow
    android:id="@+id/tableRowPuerto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/tvPuerto"
        android:layout_width="40dp"
        android:fontFamily="sans-serif-condensed"
        android:gravity="left"
        android:text="Puerto"
        android:textColor="#1534e3"
        android:textSize="22sp" />

    <EditText
        android:id="@+id/etPuerto"
        android:layout_width="60dp"
        android:fontFamily="sans-serif-condensed"
        android:gravity="start"
        android:hint="puerto"
        android:inputType="number"
        android:singleLine="true"
        android:textColor="#008caf"
        android:textSize="20sp" />
</TableRow>

<!-- fila para el boton conectar -->

<TableRow
    android:id="@+id/tableRowConectar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="right" >

        <!--
        se requiere un frameLayout para poder redimensionar el boton y posicionarlo donde
        se desea, ya que el tableRow bloquea estos aspectos.
        -->
        <Button
            android:id="@+id/btConectar"
            android:layout_width="135dp"
            android:layout_height="45dp"
            android:layout_gravity="end"
            android:background="@drawable/shapebutton"
            android:fontFamily="sans-serif-condensed"
            android:text="@string/btConectar"
            android:textColor="#FFFFFF"
            android:textSize="18sp"
            />
</TableRow>
<!-- fila para la respuesta del servidor cuando conecta -->
<TableRow
    android:id="@+id/tableRowRespuesta"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="left" >

    <TextView
        android:id="@+id/tvRespuesta"
        android:layout_width="120dp"
        android:fontFamily="sans-serif-condensed"
        android:gravity="left"
        android:textColor="#009688"
        android:textSize="20sp" />
</TableRow>`</TableLayout> </RelativeLayout>`

This is the logcat output when I press the button:

12-21 21:32:16.628 29269-29269/com.example.daviddiez.clientearduinotab D/GestureDetector: [Surface Touch Event] mSweepDown False, mLRSDCnt : -1 mTouchCnt : 2 mFalseSizeCnt:0

The method that the button should call:

    public void eventoConectar(View v){
    Log.i(TAG,"eventoConectar");

    String port = metPuerto.getText().toString();
    puerto = Integer.parseInt(port);
    ip = metIP.getText().toString();
    SavePrefs sp = new SavePrefs();
    sp.guardarPreferencias(ip, puerto, super.getActivity());
    WifiManager mWifiManager = (WifiManager) super.getActivity().getSystemService(Context.WIFI_SERVICE);
    status = mWifiManager.isWifiEnabled();
    vista = v;
    Log.i(TAG, "status wifi " + status);
    cas = new ConnectAndroidServer(ip, puerto, cont,ClienteActivity.this);
    cas.delegate = this;
    if (status == false) {//si el status de conexion es falso, se le pregunta al usuario si desea activar la wifi,
        //salir, o no activar.
        mostrarDialog(vista, " necesita Activar la conexion WiFi",
                "Salir");
    } else {
        cas.execute();
        Log.i(TAG, "lanzado AsyncTask");

        primerConexion=true;
    }

    new ProgramadorConexion(ClienteActivity.this);
}

Here's screenshot from first fragment on the left and screenshot from second fragment with working buttons on the left:

第一个片段的屏幕截图 第二个片段的屏幕截图,带有工作按钮

Tabbed Pane for show different views.

    public class TabActivity extends AppCompatActivity {

    private SectionsPagerAdapter mSectionsPagerAdapter;
    private ViewPager mViewPager;

    ClienteActivity clienteActivity;
    private static final String TAG="1-TabActivity";

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());


        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setPageTransformer(true,new ZoomOutPageTransformer());
        mViewPager.setAdapter(mSectionsPagerAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_tab, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        private static final String ARG_SECTION_NUMBER = "section_number";

        public PlaceholderFragment() {
        }

        /**
         * Returns a new instance of this fragment for the given section
         * number.
         */
        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            Log.i(TAG,"onCreateView");

            View rootView = inflater.inflate(R.layout.activity_cliente, container, false);
            //TextView textView = (TextView) rootView.findViewById(R.id.section_label);
            //textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
            return rootView;
        }
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Log.i(TAG,"getItem position"+position);
            switch (position){
                case 0:
                    Log.i(TAG,"getItem case 0");
                    return PlaceholderFragment.newInstance(position + 1);
                    //return PlaceholderFragment.newInstance(position + 1);
                case 1:
                    Log.i(TAG,"getItem case 1");
                    //ClienteActivity ca=new ClienteActivity();
                    SwitchingActivity sa2=new SwitchingActivity();
                    //return PlaceholderFragment.newInstance(position + 1);
                    return sa2;
                case 2:
                    Log.i(TAG,"getItem case 2");
                    SwitchingActivity sa=new SwitchingActivity();
                    return sa;
            }
            //
            return null;
        }
        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }
        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Servidor";
                case 1:
                    return "Control";
                case 2:
                    return "SECTION 3";
            }
            return null;
        }
    }
}

Why do you use?:

super.getActivity().findViewById(R.id.btConectar);

Replace it for:

rootView.findViewById(R.id.btConectar);

Well, after looking for a reason of the failure on the button, i find this: I have to instiate the fragment on getItem() method. Changing this part of code:

    @Override
    public Fragment getItem(int position) {
        Log.i(TAG,"getItem position"+position);
        switch (position){
            case 0:
                Log.i(TAG,"getItem case 0");
                return PlaceholderFragment.newInstance(position + 1);
                //return PlaceholderFragment.newInstance(position + 1);
            case 1:
                Log.i(TAG,"getItem case 1");
                //ClienteActivity ca=new ClienteActivity();
                SwitchingActivity sa2=new SwitchingActivity();
                //return PlaceholderFragment.newInstance(position + 1);
                return sa2;
            case 2:
                Log.i(TAG,"getItem case 2");
                SwitchingActivity sa=new SwitchingActivity();
                return sa;
        }
        //
        return null;
    }

for this:

        @Override
    public Fragment getItem(int position) {
        Log.i(TAG,"getItem position"+position);
        switch (position){
            case 0:
                Log.i(TAG,"getItem case 0");
                ClienteActivity ca=new ClienteActivity();
                return ca;
            case 1:
                Log.i(TAG,"getItem case 1");
                SwitchingActivity sa2=new SwitchingActivity();
                return sa2;
            case 2:
                Log.i(TAG,"getItem case 2");
                SwitchingActivity sa=new SwitchingActivity();
                return sa;
        }
        //
        return null;
    }

Making this change the button and everything else work perfectly. Thanks @cricket_007 and others for your help in this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM