2016-07-22 45 views
-2

我想隱藏/顯示從活動片段中的按鈕,但它給我下面的異常。從活動片段隱藏/顯示按鈕

android.view.ViewRootImpl $ CalledFromWrongThreadException:只有創建視圖層次結構的原始線程可以觸及其視圖。

首頁活動

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); 
    } 
} 

類別片段

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> 

代碼太大,在此發佈。這就是爲什麼我只發佈代碼,我發現問題。

我能夠得到newDesigns BUTTON實例。我感到震驚的是,如果嘗試玩按鈕實例(VISIBLE/GONE),它會給我上面提到的異常。

幫助表示讚賞。

+0

類似的問題已經被問了很多次做一個片段欣賞訪問!避免提出類似的問題! –

+0

看到這個鏈接http://stackoverflow.com/questions/20124557/disable-button-in-fragment-from-main-activity –

+1

[Android的可能的重複「只有創建視圖層次結構的原始線程可以觸及其視圖。 「錯誤在片段](http://stackoverflow.com/questions/18656813/android-only-the-original-thread-that-c​​reated-a-view-hierarchy-can-touch-its-vi) –

回答

0

在你的片段類

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

,並在活動類添加一個方法

加入這一行

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

這將保持不必要當不需要時參考活着。如果片段被破壞,應用程序也會崩潰。 – Kushan

+1

這只是一個例子,有幾種方法可以像'使用標籤引用'一樣訪問活動片段,'使用弱引用','使用變量引用',對於這個特殊的例子,這個例子最適合。 –

0

你不應該與該片的,而你的視圖玩直接在Activity中。你不會知道視圖的狀態是什麼,這可能會導致你甚至無法想到的問題(當我面對很多問題時,相信我)。要與活動的視圖進行交互,請創建一個界面:

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

現在在片段類中實現此操作並重寫該方法。

class YourFragment implements AccessFragmentViews{ 

. 
. 

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

現在,您可以使用此界面安全地與活動內的片段視圖進行交互。確保片段是活着這樣做雖然之前;)訪問孩子的觀點傾向於WindowLeakedExceptions和illegalstateexceptions

在活動中使用它,如下所示:

你可以通過任一片段引用通過查找它的標籤或使用你所使用的參考創建片段

//注意:它是非常非常危險的,從活動

//first the alive check then the logic 

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

他想改變片段視圖,而不是活動視圖,據我瞭解他的問題 –

+0

糟糕...扭轉順序,然後哈哈。 @MohammedAtif謝謝:) – Kushan

+0

我想,逆序實施起來有點棘手,你需要通過標籤訪問片段來調用方法。絕對接口在你的情況下工作,但反向並不危險。 –