当前位置: 首页 > 知识库问答 >
问题:

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

刘博雅
2023-03-14

我试图从活动中隐藏/显示片段中的按钮,但它给了我以下异常。

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>

代码太大,无法在此处发布。这就是为什么我只在发现问题的地方发布代码。

我能够获得新设计按钮实例。令我震惊的是,如果尝试玩按钮实例(可见/消失),它会给我上述异常。

感谢您的帮助。

共有2个答案

蒯胜泫
2023-03-14

在片段类中添加方法

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);
     }
 }
侯和惬
2023-03-14

当您直接在活动中时,不应使用片段视图。你不知道视图的状态是什么,这可能会导致你甚至想不起来的问题(相信我,我遇到过很多)。要与活动视图交互,请创建一个界面:

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
}
 类似资料:
  • 我正在开发包含2个片段的应用程序,我想根据需要显示隐藏。下面的代码有一个简单的例子来说明我的问题。这个简单的Fragmentactivity包含一个按钮和一个listfragment。 这个简单的例子完美无瑕。但我不满足于展示隐藏片段。如果删除布局。设置可见性(View.GONE);然后从代码中选择ft.hide(f);不会隐藏碎片。事实上,我们不是在隐藏片段,而是在隐藏容器。 我的问题是,这是一

  • 有很多关于查找显示/隐藏软键盘事件的帖子。我发现自己的处境是,我需要根据软键状态在片段中更改图标。 我试图实现onMeasure,但我无法在片段中覆盖它。是否有一种(相对)无痛的方式可以在我的片段中获得清晰的显示/隐藏软键盘事件,或者我应该放弃?

  • 排除不显示字段 Model.findAll({ attributes: { exclude: ['baz'] } });

  • 我在使用Google的支持设计库中的FloatingActionButton时遇到了一些麻烦。按钮和onClickListener工作正常,但问题在于: 当我隐藏按钮和我显示它之后,按钮不直接执行onClick方法时,点击第一次,它必须点击2次工作。我没有在onClick中做任何复杂的事情,这些事情只需要为视图运行一个简单的就可以了。下面是我的代码,尽管我怀疑那里有什么问题:

  • 我有一个带有底部导航视图、浮动操作按钮和四个片段的活动。我只想在“fragment1”和“fragment2”上显示浮动操作按钮,并在选择“fragment3”或“fragment4”时将其隐藏。启动应用程序时,“fragment1”会显示为浮动操作按钮,当我导航到“fragment3”时,我设法将其隐藏起来。但问题是,当我从“fragment3”或“fragment4”导航回“fragment1

  • 嗨,我正在一个应用程序中工作,其中: 活动中有查看寻呼机 问题: 问题是,当我从frag3返回到frag1时,有时frag1没有附加到活动。 我不知道这是怎么发生的。 如果发生这种情况,那么解决方案是什么,以便我可以停止活动以分离frag1或再次重新初始化frag1。 请帮忙。