2016-07-22 18 views
-2

Ich versuche, Button in Fragment von Aktivität zu verstecken/zu zeigen, aber es gibt mir folgende Ausnahme.Hide/Show Button in Fragment von Aktivität

android.view.ViewRootImpl $ CalledFromWrongThreadException: Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren.

Hause Aktivität

public class HomeActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 
     CategoryFragment frag=(CategoryFragment) activity.getSupportFragmentManager() 
            .findFragmentByTag("cat_frag"); 
     Button newDesigns= (Button) frag.getView().findViewById(R.id.new_designs); 
     newDesigns.setVisibility(View.VISIBLE); 
    } 
} 

Kategorie Fragment

public class CategoryFragment extends Fragment{ 
    Button newDesigns; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View v = inflater.inflate(R.layout.fragment_category, null); 
     newDesigns= (Button) v.findViewById(R.id.new_designs); 
    } 
} 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#CCCCCC"> 

    <TextView 
     android:id="@+id/list_name" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:background="@drawable/shape_logo_bg" 
     android:gravity="center" 
     android:padding="5dp" 
     android:textColor="@android:color/white" 
     android:textSize="18sp" /> 

    <Button 
     android:id="@+id/new_designs" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/list_name" 
     android:background="@color/edit_button_color" 
     android:padding="10dp" 
     android:text="@string/new_designs" 
     android:textColor="@color/btn_text_color" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="5dp" 
     android:visibility="gone" 
     /> 
</RelativeLayout> 

-Code ist zu groß, hier gebucht zu werden. Deshalb habe ich nur den Code gepostet, wo ich ein Problem finde.

Ich bin in der Lage, newDesigns BUTTON instance.Was ist schockierend für mich ist, wenn versuchen, mit Button-Instanz (VISIBLE/GONE) zu spielen gibt es mir oben genannten Ausnahme.

Hilfe ist willkommen.

+0

ähnliche Fragen oft gestellt wurden! Unterlassen Sie ähnliche Fragen! –

+0

siehe diesen Link http://stackoverflow.com/questions/20124557/disable-button-in-fragment-from-main-activity –

+1

Mögliches Duplikat von [Android "Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren. " Fehler in Fragment] (http://stackoverflow.com/questions/18656813/android-only-the-original-thread-that-created-a-view-hierarchy-can-touch-its-vi) –

Antwort

0

eine Methode in Ihrer Fragment Klasse hinzufügen

public void changeButtonVisibility(boolean visibility){ 
    if(visibility){ 
    newDesigns.setVisibility(View.VISIBLE); 
    }else{ 
    newDesigns.setVisibilty(View.GONE); 
    } 
} 

und in Ihrer Aktivitätsklasse

diese Zeile hinzufügen

public class HomeActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 
     CategoryFragment frag=(CategoryFragment) activity.getSupportFragmentManager() 
            .findFragmentByTag("cat_frag"); 
     frag.changeButtonVisibility(true); 
    } 
} 
+0

Dies wird unnötig bleiben Referenzen lebend, wenn sie nicht benötigt werden. Auch wenn das Fragment zerstört wird, stürzt die App ab. – Kushan

+1

Dies ist nur ein Beispiel, es gibt mehrere Möglichkeiten, auf lebendige Fragmente zuzugreifen, wie 'using tag reference',' weak references', 'variable referenz' verwenden. Für dieses spezielle Beispiel passt dieses am besten. –

0

Sie sollten nicht mit Blick auf das Fragment, während Sie spielen sind in einer Aktivität direkt. Sie werden nicht wissen, wie der Zustand der Ansicht sein wird, und dies kann möglicherweise zu Problemen führen, an die Sie nicht einmal denken können (glauben Sie mir, ich habe viele gesehen). Um mit den Ansichten der Aktivität zu interagieren, erstellen Sie eine Schnittstelle:

public interface AccessFragmentViews{ 
    public void setVisibilityForButton(boolean bool); 
    //any other methods that you need 
} 

Implementieren Sie dies jetzt in der Fragmentklasse und überschreiben Sie die Methode.

class YourFragment implements AccessFragmentViews{ 

. 
. 

    public void serVisibilityForButton(boolean shouldHide){ 
     if(shouldHide){ 
      yourButton.setVisibility(View.GONE); 
     }else{ 
      yourButton.setVisibility(View.VISIBLE); 
     } 
    } 
} 

Jetzt können Sie sicher mit den Ansichten des Fragments innerhalb einer Aktivität interagieren, die diese Schnittstelle verwendet. Stellen Sie sicher, dass das Fragment obwohl am Leben ist, bevor Sie so;) Zugriff auf Kinder Ansicht neigen zu WindowLeakedExceptions und illegalstateexceptions

In der Tätigkeit, die er wie folgt verwenden:

Sie kann entweder durch das Fragmentverweis erhalten finden sie durch ihre Tag oder durch den Verweis Sie verwenden mit dem Fragmente

// HINWEIS zu erstellen: es ist sehr, sehr gefährlich zu tun, um den Zugriff auf einem Fragmente Ansichten aus einer Tätigkeit

//first the alive check then the logic 

if(yourFragmentReference!=null){ 
((AccessFragmentViews)yourFragmentReference).setVisibilityForButton(true);// or false if you want to make it visible 
} 
+0

Er will Fragmentansicht ändern, nicht die Aktivitätsansicht, soweit ich seine Frage verstehe –

+0

Hoppla ... die Reihenfolge umkehren dann lol. @MohammedAtif danke :) – Kushan

+0

Ich denke, umgekehrte Reihenfolge ist ein wenig komplizierter zu implementieren, Sie müssen auf Fragment über sein Tag zugreifen, um die Methoden aufzurufen. Auf jeden Fall funktionieren Schnittstellen in Ihrem Fall, aber umgekehrt ist wenig gefährlich. –

Verwandte Themen