【问题标题】:pass string from fragment main activity to fragments activity in viewpager将字符串从片段主要活动传递到 viewpager 中的片段活动
【发布时间】:2014-02-05 09:53:36
【问题描述】:

我想将一个字符串从片段活动(主要)传递给所有片段(子),可能这张图片可以解释我到底想要做什么

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

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

我尝试遵循此代码https://stackoverflow.com/a/12739968/2003393,但它无法解决我的问题..

请帮帮我……我卡住了

提前致谢。

这是我的片段活动 (MainActivity) 中的代码

公共类 Swipe_Menu 扩展 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);
}

}

【问题讨论】:

    标签: android string android-fragments fragment


    【解决方案1】:

    您无法直接访问位于ViewPager 中的片段,因此您无法直接引用它们。

    在这些情况下,我所做的是从 Activity 向 Fragments 发送广播消息。出于这个原因,在片段中注册一个BroadcatReceiver(在onCreateonCreateView - 你的决定)m,为该接收器设置一个自定义操作(例如"my_package.actions.internal.BROADCAST_ACTION"),不要忘记取消注册接收器从互补的方法。

    当您想从活动中发送消息时,使用上述操作创建一个意图,在意图额外中添加字符串并发送广播。

    在您的接收者的onReceive 方法中(在片段内),从intent 参数中获取字符串,然后您就有了字符串。

    有道理吗?

    编辑:为了提供一些代码,下面是我对片段所做的更改:

    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?
    • AndroidManifest 文件怎么样?我应该为 Broadcastreceiver 配置它吗?
    • 你不需要;因为您正在从应用程序内部向其组件发送消息。
    • 我已经像您的方法一样编辑了我的代码,但是我的子活动 (Store_Swipe ) 无法从主要活动 (Swipe_Menu) 接收字符串...怎么了?..请检查我编辑的代码
    • 您是否从活动中发送了广播消息?意图具有相同的操作?
    【解决方案2】:

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

     // 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 方法...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多