从活动中隐藏/显示片段中的按钮

时间:2016-07-22 06:18:49

标签: android android-layout android-fragments

我试图隐藏/显示来自Activity的片段中的Button但是它给了我以下异常。

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)它会给我上面提到的异常。

非常感谢帮助。

2 个答案:

答案 0 :(得分: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);
     }
 }

答案 1 :(得分:0)

当您直接参加活动时,您不应该使用片段视图。你不会知道观点的状态是什么,这可能会导致你甚至无法想到的问题(相信我,我面对很多)。要与活动的视图进行交互,请创建一个界面:

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

现在在fragment类中实现它并覆盖该方法。

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
}