如何从android中的父活动修改片段的textview

时间:2016-06-24 10:54:15

标签: android android-fragments android-activity view

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

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);

如何从我的活动中修改片段的textview?我试图从父活动

获取MainFragment的视图
   TextView textview_buy_SLPro = (TextView) howtogetMainFragment.findViewById(R.id.txt_Buy_Pro);

5 个答案:

答案 0 :(得分:0)

尝试使用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());
}

答案 1 :(得分:0)

我认为更好的解决方案是片段

中的create方法
 public void setBuySLPro(String data) {
       textview_buy_SLPro.setText(data);
 }

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

字段应根据CamelCase规则命名。

答案 2 :(得分:0)

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

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!");

    ...
}

答案 3 :(得分:0)

您正在谈论属于ViewPager的片段,因此您有两个问题:

  • 您的片段可能没有活动视图(例如,如果您已从其中滑过几页)。因此片段的TextView可能甚至不存在。

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

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

模式如下:

  • 为活动创建interface;恩。 TextUpdateListener

  • 为您的活动添加听众列表

  • 当片段创建其视图时,它会向活动添加一个侦听器,当它破坏视图时,它会取消注册侦听器。侦听器在从活动接收到事件时将更新其视图。

  • 当值更改时,活动将通过侦听器列表并调用其事件方法。

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

答案 4 :(得分:0)

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