Android 如何从父活动以编程方式更改片段视图

Android 如何从父活动以编程方式更改片段视图,android,Android,我有一个包含例如一个按钮的片段,我想允许包含该片段的活动更改此按钮视图,例如颜色和标题或src图像。 最好的方法是什么 更新:如果我不够清楚,很抱歉,但我希望活动可以随意更改整个视图,如设置填充、颜色或其他任何内容。 它将以编程方式创建视图,片段应将旧视图替换为新视图,并更改视图的ID,以便片段代码不受影响。如果我在获取这些视图的片段中创建了方法,那么主活动应该在什么时候调用它们?因为活动必须等待创建片段的布局。1。您必须从活动中获取片段 val fragment = supportFragme

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

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

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

val fragment = supportFragmentManager.findFragmentByTag("tag")
fragment.hideButton()

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

val fragment = supportFragmentManager.findFragmentByTag("tag")
fragment.hideButton()

或者您可以使用界面

根据您的要求尝试这种方式

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);
    }
}
创建基本活动类

public abstract class BaseActivity extends AppCompatActivity{
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
     public void setCurrentOpenedFragment(BaseFragment currentFragment){}
}
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();
  }
}
扩展片段中的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());
    }
} 
在活动类中编写以下代码行

public abstract class BaseActivity extends AppCompatActivity{
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
     public void setCurrentOpenedFragment(BaseFragment currentFragment){}
}
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();
  }
}

希望它能帮助您

使用。我不能传递捆绑包中的视图吗?如果在活动的onCreate中调用refreshView方法,这将如何工作?您好,请检查活动中更新的答案,您可以从Activity onCreate方法更新refreshView方法中的片段视图,这只是管理和更新视图的一种方式,您可以根据自己的要求进行管理上述代码是管理活动中片段的最佳方式,您可以尝试这种为多个片段编码的方式,但这并没有解释如何将完整视图从活动传递到片段Hi..我已经用标准方式改进并更新了我的答案-changeFragment(new YourFragment(),HOME);将在活动前显示yourFragment,您可以使用此方法对其他片段也进行显示。-调用setdata(使用片段视图设置pojo)和refreshview方法,而不仅仅是从按钮单击setCurrentOpenedFragment()在此重写方法中,您将获得当前片段对象。-currentFragmentOnDrawer.refreshview()此方法将从所需位置更新视图。