Autore Topic: setVisibility() non funzionante su fragment  (Letto 338 volte)

Offline dennypao

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy SII
  • Sistema operativo:
    4.1.2
setVisibility() non funzionante su fragment
« il: 11 Settembre 2014, 12:45:31 CEST »
0
Salve a tutti,
ho una app strutturata su fragment. Sul layout della homeFragment ho un 'button' e una 'imagebutton' (di default invisibile);

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

    <Button
       android:id="@+id/btnStart"
       android:layout_width="100dp"
       android:layout_height="100dp"
       android:layout_centerHorizontal="true"
       android:layout_centerVertical="true"
       android:text="@string/start_recording" />

    <ImageButton
       android:id="@+id/imgbtnPlay"
       android:contentDescription="@string/play_dsc"
       android:layout_width="100dp"
       android:layout_height="100dp"
       android:layout_alignParentBottom="true"
       android:layout_centerHorizontal="true"
       android:layout_marginBottom="70dp"
       android:src="@drawable/ic_action_play"
       android:visibility="gone" />

</RelativeLayout>

al click dello "btnStart" vorrei rendere visibile il "imgbtnPlay", per poi renderlo ancora invisibile, questo il codice dell' homefragment

Codice (Java): [Seleziona]
public class HomeFragment extends Fragment implements OnClickListener{
       
        private static final String STRING_BUTTON_START = "START";
        private static final String STRING_BUTTON_STOP = "STOP";
        private int currentString = 0;
       
        public HomeFragment(){}
       
        @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
        View rootView = inflater.inflate(R.layout.fragment_home, container, false);
         
                Button button1 = (Button) rootView.findViewById(R.id.btnStart);
                button1.setOnClickListener(this);
                Button button2 = (Button) rootView.findViewById(R.id.imgbtnPlay);
                button2.setOnClickListener(this);    
       
        return rootView;
    }
       
        public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnStart: {      
                if(currentString==0){
                Toast.makeText(this.getActivity(), "START", Toast.LENGTH_SHORT).show();
       
                ((ImageButton) v.findViewById(R.id.imgbtnPlay)).setVisibility(View.VISIBLE);
               
                currentString=1;
               }else{
                Toast.makeText(this.getActivity(), "STOP", Toast.LENGTH_SHORT).show();
                ((ImageButton) v.findViewById(R.id.imgbtnPlay)).setVisibility(View.GONE);
                currentString=0;

                }
                break;
            }
            case R.id.imgbtnPlay:
                                Toast.makeText(this.getActivity(), "play", Toast.LENGTH_LONG).show();
                                        break;        
           
        }
        }

}

il problema è che al click del bottone, l'app crasha e il problema a quanto pare è sul metodo setVisibility() ma non capisco come debba modificarlo.

Codice: [Seleziona]
09-11 10:37:06.473: E/AndroidRuntime(803): FATAL EXCEPTION: main
09-11 10:37:06.473: E/AndroidRuntime(803): java.lang.NullPointerException
09-11 10:37:06.473: E/AndroidRuntime(803):         at com.aandd.simbaproject.activity.HomeFragment.onClick(HomeFragment.java:57)
09-11 10:37:06.473: E/AndroidRuntime(803):         at android.view.View.performClick(View.java:4084)
09-11 10:37:06.473: E/AndroidRuntime(803):         at android.view.View$PerformClick.run(View.java:16966)
09-11 10:37:06.473: E/AndroidRuntime(803):         at android.os.Handler.handleCallback(Handler.java:615)
09-11 10:37:06.473: E/AndroidRuntime(803):         at android.os.Handler.dispatchMessage(Handler.java:92)
09-11 10:37:06.473: E/AndroidRuntime(803):         at android.os.Looper.loop(Looper.java:137)
09-11 10:37:06.473: E/AndroidRuntime(803):         at android.app.ActivityThread.main(ActivityThread.java:4745)
09-11 10:37:06.473: E/AndroidRuntime(803):         at java.lang.reflect.Method.invokeNative(Native Method)
09-11 10:37:06.473: E/AndroidRuntime(803):         at java.lang.reflect.Method.invoke(Method.java:511)
09-11 10:37:06.473: E/AndroidRuntime(803):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-11 10:37:06.473: E/AndroidRuntime(803):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-11 10:37:06.473: E/AndroidRuntime(803):         at dalvik.system.NativeStart.main(Native Method)

premetto che sono 2 settimane che ho iniziato a sviluppare per android e non ho ancora ben chiara la questione delle View e del Context, che da ignorante credo sia il problema,

Grazie in anticipo

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:setVisibility() non funzionante su fragment
« Risposta #1 il: 11 Settembre 2014, 13:43:26 CEST »
0
Secondo me l'errore è qua:

Codice (Java): [Seleziona]
((ImageButton) v.findViewById(R.id.imgbtnPlay)).setVisibility(View.VISIBLE);
Non ha senso cercare l'id del btnPlay dentro l'ImageButton.

Sposta la dichiarazione button2 fuori dalla OnCreateView(), così ti rimane anche quando ha finito la OnCreateView(), ed usala nella OnClick senza richiamare il findViewById.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline dennypao

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy SII
  • Sistema operativo:
    4.1.2
Re:setVisibility() non funzionante su fragment
« Risposta #2 il: 11 Settembre 2014, 14:56:38 CEST »
0
si hai ragione l'errore è in quella riga!!
ho già provato a definirlo fuori ma non capisco bene con quale View definirlo.
In una activity che estende "Activity" non ci sono problemi, ma nei Fragment si; in tutti gli esempi che ho trovato i vari android.widget vengono definiti dentro onCreateView().
Ho letto la documentazione ufficiale ma non ho capito molto sinceramente.


Post unito: [time]11 Settembre 2014, 15:11:26 CEST[/time]
x adesso ho risolto facendo così:
Codice (Java): [Seleziona]
 ((ImageButton) getView().findViewById(R.id.imgbtnPlay)).setVisibility(View.VISIBLE);
così non crasha. ma per un codice più pulito preferirei la tua soluzione, definendo i widget fuori dall'onCreateView()
« Ultima modifica: 11 Settembre 2014, 15:13:15 CEST da dennypao, Reason: Merged DoublePost »