【问题标题】:how to change fragment views programmatically from the parent activity如何以编程方式从父活动更改片段视图
【发布时间】:2019-10-30 18:10:01
【问题描述】:

我有一个包含例如一个按钮的片段,我想允许包含该片段的 Activity 更改此按钮视图,例如颜色和标题或 src 图像。 最好的方法是什么?

更新:抱歉,如果我不够清楚,但我希望 Activity 可以随意更改整个视图,例如设置填充、颜色或其他任何内容。 它将以编程方式创建视图,片段应该用新视图替换旧视图并更改视图的 ID,以便片段代码不受影响。如果我在获取这些视图的片段中创建了方法,那么主活动应该何时调用它们?因为活动必须等待片段的布局被创建。

【问题讨论】:

  • 使用interfaces
  • 我不能传递包中的视图吗?

标签: android


【解决方案1】:

1.您必须从活动中获取片段

val fragment = supportFragmentManager.findFragmentByTag("tag")

val fragment = supportFragmentManager.findFragmentById(R.id.fragment)

2。创建一个可以在片段中执行您想要的操作的方法并从活动中调用此方法

fragment.hideButton()

或者你可以使用接口

【讨论】:

    【解决方案2】:

    根据你的要求试试这个方法

    public abstract class BaseFragment extends Fragment {
        BaseActivity yourActivity;
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
       @Override
       public void onAttach(Context context) {
           super.onAttach(context);
          yourActivity = (BaseActivity) context;
       }
    
       @Override
       public void onDetach() {
           yourActivity = null;
           super.onDetach();
        }
    
    
        public void refreshview(){} 
    
        public void setDada(Data data){}
    
    
        @override
        publicn void onStart(){
            yourActivity.setCurrentOpenedFragment(this);
        }
    }
    

    创建 BaseActivity 类

    public abstract class BaseActivity extends AppCompatActivity{
       @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
         public void setCurrentOpenedFragment(BaseFragment currentFragment){}
    }
    

    在您的片段中扩展 BaseFragment,即

    public class YourFragment extends BaseFragment{
       View view;       
       Button button;
       @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {       
              view = inflater.inflate(R.layout.fragment, container, false);
              button = (Button)view.findViewById(R.id.button);
              return view;
        }
    
        @override
        publicn void onStart(){
          super.onStart();
          //yourActivity.setCurrentOpenedFragment(this);
       }
    
       Data data; 
       @override 
       public void setDada(Data data){
         this.data = data;
       } 
        @Override 
        public void refreshview() {
           button.setcolor(data.getcolor());
        }
    } 
    

    在您的 Activity 类中编写以下代码行

    public class YourActivity extends BaseActivity{
    
       public static final byte NONE =  -1;
       public static final byte HOME =  1;
    
       @Override
        protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
                setContentView(R.layout.your_activity);
                changeFragment(new YourFragment(), HOME);
                initview();
        }
    
       public void initview(){
            Button b = (Button)findViewById(R.id.button);
            b.setOnClickListener(new OnClickListener(){
              if(currentFragmentOnDrawer != null){
    
                Data data = new Data();
                data.setColor(getResource().getcolor(R.color.red));
                currentFragmentOnDrawer.setDada(data);
    
                currentFragmentOnDrawer.refreshview()
    
             }
           });
       }
    
       BaseFragment currentFragmentOnDrawer;
        @Override
        public void setCurrentOpenedFragment(BaseFragment currentFragment) {
            super.setCurrentOpenedFragment(currentFragment);
            this.currentFragmentOnDrawer = currentFragment;
        }
    
       public void changeFragment(Fragment targetFragment, byte state) {
    
          FragmentTransaction ft = getSupportFragmentManager()
                .beginTransaction();
          ft.replace(R.id.main_fragment, targetFragment, "" + state);
          ft.addToBackStack("" + state);
          ft.commit();
      }
    }
    

    希望对你有帮助

    【讨论】:

    • 如果在Activity的onCreate中调用refreshView方法会怎样?
    • 你好,请查看activity中更新的答案,你可以在activity的oncreate方法的refreshView方法里面更新你的fragment view,它只是一种管理和更新view的方式,你可以按照根据您的要求
    • 以上代码是在activity中管理fragment的最佳方式,你也可以试试这种多fragment的编码方式
    • 这里没有解释如何将完整视图从活动传递到片段
    • 嗨..我已经以标准方式改进和更新了我的答案 - changeFragment(new YourFragment(), HOME);将在活动前面显示yourFragment,您可以使用此方法为其他片段也显示。 - 从您想要的位置调用 setdata(使用片段视图设置 pojo)和 refreshview 方法,而不仅仅是单击按钮。 - setCurrentOpenedFragment() 在这个覆盖方法中你会得到当前的片段对象。 - currentFragmentOnDrawer.refreshview() 这个方法将从你想要的位置更新视图。
    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多