【问题标题】:How to modify a textview of the fragment from parent activity in android如何从android中的父活动修改片段的文本视图
【发布时间】:2016-10-26 23:21:54
【问题描述】:

在我的活动中,我创建了一些片段

public class MainActivity extends AppCompatActivity implements IabBroadcastListener{
    static ViewPagerAdapter adapter;

    ....
    adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new MainFragment(), "\uE602");
    adapter.addFragment(new QuestionsListFragment(), "\uE620");
    adapter.addFragment(new MyQuestionsFragment(), "\uE61E");
    adapter.addFragment(new NotificationsFragment(), "\uE601");
    adapter.addFragment(new ProfileSettingFragment(), "\uE605");
    viewPager.setAdapter(adapter);

如何像我的活动中的片段的文本视图一样进行修改?我试图从父活动中获取 MainFragment 的视图

   TextView textview_buy_SLPro = (TextView) howtogetMainFragment.findViewById(R.id.txt_Buy_Pro);

【问题讨论】:

    标签: android android-fragments android-activity view


    【解决方案1】:

    您可以在片段中创建一个方法,以更改视图甚至返回它。

    public class MyFragment extends Fragment {
    
        TextView mTextView;
    
        ....
    
        public void setTextView(String text){
            mTextView.setText(text);
        }
    
        ....
    
    }
    

    从你的活动中调用它:

    public class MainActivity extends AppCompatActivity implements IabBroadcastListener{
        static ViewPagerAdapter adapter;
    
        ....
    
        MainFragment mMainFragment = new MainFragment();
    
        adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(mMainFragment, "\uE602");
        adapter.addFragment(new QuestionsListFragment(), "\uE620");
        adapter.addFragment(new MyQuestionsFragment(), "\uE61E");
        adapter.addFragment(new NotificationsFragment(), "\uE601");
        adapter.addFragment(new ProfileSettingFragment(), "\uE605");
        viewPager.setAdapter(adapter);
    
        ....
    
        //call method inside fragment
        mMainFragment.setTextView("Hello World!");
    
        ...
    }
    

    【讨论】:

      【解决方案2】:

      尝试使用onActivityCreated()

      @Override
      public void onActivityCreated (Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
      
        TextView textview_buy_SLPro = (TextView) getView().findViewById(R.id.txt_Buy_Pro);
        textview_buy_SLPro.setText(getActivity.getSomeText());
      }
      

      【讨论】:

        【解决方案3】:

        我认为更好的解决方案是在片段中创建方法

         public void setBuySLPro(String data) {
               textview_buy_SLPro.setText(data);
         }
        

        并从活动中调用此方法。从活动中访问片段视图并不是最好的主意。

        字段名称应符合驼峰命名规则。

        【讨论】:

          【解决方案4】:

          您所说的片段是ViewPager 的一部分,因此您有两个顾虑:

          • 您的片段可能没有活动视图(例如,如果您已从它滑开几页)。所以片段的TextView 可能根本不存在。

          • 片段本身甚至可能不存在(例如,如果您没有滑动足够多的页面来创建片段,或者您正在继承 FragmentStatePagerAdapter 的子类)。

          我发现对于这种情况,最好的设计是事件侦听器模式,其中片段在创建视图时在活动上设置侦听器。此外,文本值应该存储在活动中,以便当有人滑动到带有该片段的页面时,该片段可以在TextView 上设置正确的值。

          模式是这样的:

          • 为事件创建一个interface;前任。 TextUpdateListener

          • 将听众列表添加到您的活动中

          • 当片段创建它的视图时,它会向活动添加一个监听器,当它销毁视图时,它会注销监听器。监听器会在接收到来自 Activity 的事件时更新其视图。

          • 当值改变时,Activity 会遍历监听器列表并调用它们的事件方法。

          我在this SO answer中给出了一个非常详细的代码示例。

          【讨论】:

            【解决方案5】:

            有很多方法可以做到这一点。我最喜欢的是使用消息总线(例如 Otto、tinybys 等)并使用事件在应用程序组件之间进行通信。这是一种设计模式,需要一些学习才能实现,但恕我直言,值得付出努力。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-08-24
              • 2021-08-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-25
              相关资源
              最近更新 更多