我试图隐藏/显示来自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)它会给我上面提到的异常。
非常感谢帮助。
答案 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
}