2014-03-06 47 views
1

我试图在一个活动和位于它上面的片段之间进行通信,我希望每次发生onclick时将新数据(图像/文本 - 从数据库中检索)传递到片段中(onclick在活动)。我做了一个简单的界面来测试(让我知道如果这不适合图像或如果它太慢或效率低),我试图让它包含在我的片段,所以当发生onclick片段更改图像和文本。如何在片段中实现监听器接口?

下面是简单的界面代码:

public interface FragmentCommunicator { 
    public void passDataToFragment(String someValue); 
} 

这里是活动代码:

public class RandomActivity extends FragmentActivity implements ActivityCommunicator { 

    //viewpager adapter 
    private PageAdapter mAdapter; 
    private ViewPager viewPager; 

    //interface through which communication is made to fragment 
    public FragmentCommunicator fragmentCommunicator; 

    //Buttons for yes, no, skip 
    Button btnYesRandom, btnNoRandom, btnSkipRandom; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_random); 

     //set buttons 
     btnYesRandom = (Button) findViewById(R.id.btnYesRandom); 

     // Initializing pager 
     viewPager = (ViewPager) findViewById(R.id.random_pager); 

     //calling bundle to attach data to fragment 
     Bundle bundle = new Bundle(); 
     bundle.putString("edttext", "From Activity"); 

     // set Fragmentclass Arguments 
     RandomFragment randFrag = new RandomFragment(); 
     randFrag.setArguments(bundle); 

     //Setting up fragment 
     FragmentManager fm = getFragmentManager(); 
     mAdapter = new PageAdapter(getSupportFragmentManager(), new UserUpVotesFragment(), randFrag, new UserDownVotesFragment()); 
     viewPager.setAdapter(mAdapter); 
     // Here you would declare which page to visit on creation 
     viewPager.setCurrentItem(1); 

     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      public void onPageScrollStateChanged(int state) {} 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 

      public void onPageSelected(int position) { 
       // Check if this is the page you want. 
       if(position !=1) { 
        //swiping to the right 
        if(position == 0) { 
         Log.e("Swiping", "SWIPING TO THE Right BUT RESET ERR"); 
         getIntent().removeExtra("edttext"); 
        } 

        //swiping to the left 
        if(position == 2) { 
         Log.e("Swiping", "SWIPING TO THE left BUT RESET ERR"); 
        } 

        // RandomFragment randomFrag = (RandomFragment) getFragmentManager().findFragmentById(R.id.fra); 

        viewPager.setCurrentItem(1); 
       } 
      } 
     }); 

     btnYesRandom.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 

       if(fragmentCommunicator != null) 
        fragmentCommunicator.passDataToFragment("Hi from FragmentActivity"); 
      } 
     }); 
    } 

代码片段:

public class RandomFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     //call data from activity bundle 
     String strtext = getArguments().getString("edttext"); 

     View rootView = inflater.inflate(R.layout.fragment_random, container, false); 

     RelativeLayout random_frag_layout = (RelativeLayout) rootView.findViewById(R.id.random_frag_layout); 

     activityButton = (ImageView) rootView.findViewById(R.id.imagehere); 
     //setRetainInstance(true); 

     texthere = (TextView) rootView.findViewById(R.id.texthere); 
     texthere.setText(strtext); 

     return rootView; 
    } 

    //FragmentCommunicator interface implementation 
    public void passDataToFragment(String someValue){ 
     activityAssignedValue = someValue; 
     Log.e("ACTIVITY", activityAssignedValue); 
    } 
} 

回答

4

如果您只有一个片段,那么您可以直接访问它并通过方法发送任何数据:将您的片段设置为一个字段并从其中调用您的passDataToFragment()

从片段访问活动,请拨打((RandomActivity)getActivity()).activityMethod()

+0

这是添加在onCreateView或片段中的确切位置?我希望能够在按下按钮的时候按下按钮的方式来调用......如果您可以向我展示示例代码或告诉我片段中的哪个部分完全被称为 – Lion789

+0

另外,如果我告诉碎片的新数据,我会调用imageview和textview中的方法来改变为新的数据,或者我怎么“膨胀”新的视图,而删除旧的? – Lion789

+0

调用片段是从您的活动中的onClick()执行的,只需调用片段而不是通信器。是的,您可以在片段的onCreateView()中调用片段中的活动来检查充气前的状态。最后一项:你可以直接更新视图而不需要重新填充。 – Dmide

0

什么是ActivityCommunicator

如果你希望走这条路线有你RandomActivity类实现FragmentCommunicator接口,要么被声明为RandomFragment类的内部公共接口说,或公开(或打包本地)在它自己的文件。

+0

哦,是一样的片段,但是从片段回活动的会谈......有没有更好的办法,我愿意去的最有效途径因为我将不断地将图片和文字传递到一起? – Lion789