2016-07-22 11 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

この行を追加します。アクティビティーに直接入っています。あなたはビューの状態がどのようになるか分からず、これは潜在的にあなたが考えることもできない問題につながります(私が多くの人に直面したことを信じてください)。アクティビティのビューとやりとりするには、インターフェイスを作成します。

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

私は、逆順は実装するのが少し難しいと思う、あなたはメソッドを呼び出すためにそのタグを介してフラグメントにアクセスする必要があります。間違いなくあなたのケースではインターフェイスが動作しますが、逆はほとんど危険です。 –

関連する問題