从主活动的片段向ViewPager中的片段活动传递字符串

3
我想从Fragment Activity(主要)向所有片段(子级)传递一个字符串,也许这张图片可以解释我想做什么。

https://dl.dropboxusercontent.com/u/57465028/SC20140205-163325.png

所以,从上面的图片中...我想通过按下按钮从edittext传递一个字符串到viewpager中的所有活动...我该怎么做?

我尝试遵循这段代码 https://dev59.com/Imcs5IYBdhLWcg3wk06X#12739968 但它不能解决我的问题...

请帮帮我...我卡住了

提前感谢。

这是来自片段活动(MainActivity)的代码:

public class Swipe_Menu extends FragmentActivity {

//String KeyWord;


//private static final String KEYWORD = "keyword";

private ViewPager _mViewPager;
private ViewPagerAdapter _adapter;
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.swipe_menu_image);


    Button Back = (Button)findViewById(R.id.account);
    ImageButton Search = (ImageButton)findViewById(R.id.search);
    EditText Keyword = (EditText)findViewById(R.id.keyword);

    final String KeyWord = Keyword.getText().toString(); 


    /**
     * Back button click event
     * */
    Back.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            finish();
        }
    });



    setUpView();
    setTab();
}

protected void sendValueToFragments(String value) {
    // it has to be the same name as in the fragment
    Intent intent = new Intent("my_package.action.UI_UPDATE");
    intent.putExtra("UI_KEY", KeyWord  );
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

这是我的片段(子活动)

public class Store_Swipe extends Fragment {

public static final String ACTION_INTENT = "my_package.action.UI_UPDATE";

String KeyWord;
private TextView kata_keyword;

protected BroadcastReceiver receiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        if(ACTION_INTENT.equals(intent.getAction())) {
            String value = intent.getStringExtra("UI_KEY");
            updateUIOnReceiverValue(value);
        }
    }
};

private void updateUIOnReceiverValue(String value) {
    // you probably want this:
    KeyWord = value;
}

public static Fragment newInstance(Context context) {
    Store_Swipe f = new Store_Swipe();
    return f;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    IntentFilter filter = new IntentFilter(ACTION_INTENT);
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, filter);
}

@Override
public void onDestroy() {
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(receiver);
    super.onDestroy();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    /*Bundle bundle = this.getArguments();
    KeyWord = bundle.getString("keyword");*/
    View view = inflater.inflate(R.layout.store_swipe, container, false);
    init(view);

    return view;

}

void init(View view) {
    kata_keyword = (TextView) view.findViewById(R.id.keyword);
    //ImageView image = (ImageView) view.findViewById(R.id.image_error);
    kata_keyword.setText(KeyWord);
}

}

2个回答

4
您无法直接访问位于ViewPager中的片段,因此无法直接引用它们。在这种情况下,我所做的是从Activity向Fragments发送广播消息。为此,在片段中注册一个BroadcatReceiver(可以在onCreateonCreateView中进行 - 由您决定),为该接收器设置自定义操作(例如"my_package.actions.internal.BROADCAST_ACTION"),不要忘记从补充方法中取消注册接收器。
当您想从Activity发送消息时,请创建一个带有上述操作的意图,将字符串添加到意图附加项中并发送广播。
在接收器的onReceive方法(在片段内部)中,从意图参数获取字符串,然后您就拥有了该字符串。
有道理吗?
编辑:为了提供一些代码,以下是我对片段所做的更改:
public class Store_Swipe extends Fragment {

    public static final String ACTION_INTENT = "my_package.action.UI_UPDATE";

    protected BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            if(ACTION_INTENT.equals(intent.getAction())) {
                String value = intent.getStringExtra("UI_KEY");
                updateUIOnReceiverValue(value);
            }
        }
    };

    private void updateUIOnReceiverValue(String value) {
        // you probably want this:
        kata_keyword.setText(value);
    }

    String KeyWord;
    private TextView kata_keyword;

    public static Fragment newInstance(Context context) {
        Store_Swipe f = new Store_Swipe();
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        IntentFilter filter = new IntentFilter(ACTION_INTENT);
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, filter);
    }

    @Override
    public void onDestroy() {
        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(receiver);
        super.onDestroy();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Bundle bundle = this.getArguments();
        KeyWord = bundle.getString("keyword");
        View view = inflater.inflate(R.layout.store_swipe, container, false);
        init(view);

        return view;

    }

    void init(View view) {
        kata_keyword = (TextView) view.findViewById(R.id.keyword);
        ImageView image = (ImageView) view.findViewById(R.id.image_error);
        kata_keyword.setText(KeyWord);
    }
}

我需要从活动中获取以下代码,参数是EditText的值:

protected void sendValueToFragments(String value) {
    // it has to be the same name as in the fragment
    Intent intent = new Intent("my_package.action.UI_UPDATE");
    intent.putExtra("UI_KEY", value);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

您需要从 onCreate 中设置的单击侦听器中调用此方法:

findViewById(R.id.button_id).setOnClickListener(new OnClickListener() {            
    @Override
    public void onClick(View v) {
        String valueThatYouWantToSend = null; /// just the value
        sendValueToFragments(valueThatYouWantToSend);       
    }
});

谢谢,@gunar 但是,我是一个Android的新手... :D 你能给我展示一些代码吗?在哪里我需要把BroadcatReceiver放在onCreate或OnCreateView中? - Arsyah
AndroidManifest文件怎么样?我需要为BroadcastReceiver进行配置吗? - Arsyah
你不需要这样做,因为你是从应用程序内部向其组件发送消息。 - gunar
对于这个误解我很抱歉,我想做的是如何从 OnClickListener 中调用 **protected void sendValueToFragments(String value)**。 - Arsyah
从您的帖子中,我想传递一个字符串从EditText......然后valueThatYouWantToSend是您的EditText getText()。toString()。有意义吗?还要记得如果有用,请投票支持答案。 - gunar
显示剩余8条评论

0

// 我认为这个解决方案能够解决你的问题

 // In Main activity put your code -----------------------------------
 public void onPageSelected(int position)
    {

        System.out.println("nilesh");   

        PageOneFragment f = new PageOneFragment();
    f.getText();

    PageTwoFragment ff = new PageTwoFragment();
    ff.setText();

    }

  //in General Class ------------------------------------------------
   public class General 
  {
     public static String name="";
  }

  // first Fragment ---------------------------------------------
   public void getText()
  {
    General.name = edittext.getText().toString();
  }

  // second Fragment ----------------------------------------------
   public void setText()
   {
      System.out.println("name**" + General.name);
      tv.setText(General.name);
  }

谢谢你的帮助,但我正在尝试像我的编辑代码一样使用BroadcastReceiver方法... - Arsyah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接