2016-03-07 68 views
0

我在ViewPager中有3 Fragments。我有不同的后退按钮功能,我想为每个Fragment实施。目前,我在每个片段中创建了与我想要后退按钮相对应的方法。我实现了一个接口在我的活动有以下methiod:片段ViewPager中的后退按钮实现

@Override 
public void onCameraBack(int i) { 
    currFrag = i; 
} 

这里的想法是,有三个片段,每个片段调用其onStart()方法这个方法。片段0传递0,片段1传递1,片段2传递2.所以通过这种方式,保持活动知道哪个片段是可见的。现在我正试图获得对该片段的引用,以便能够调用我已经在其中实现的后退方法。我试着用这个:

@Override 
public void onBackPressed() { 
    if (currFrag == 0) { 

    } 
    else if (currFrag == 1) { 
     FragmentBTesting fragmentBTesting= new FragmentBTesting(); 
     fragmentBTesting.FragmentBBack(); 
    } 
}` 

但这是行不通的。我不能使用findFragmentbyId方法,因为我的片段在其XML中没有片段标签,它们填满了整个屏幕,并且使用linearLayouts定义了它们的视图。我的问题是如何获得片段的实例,以便我可以调用它的FragmentBack()方法。

这里是我的全部活动

public class FragmentActivityTesting extends FragmentActivity implements FragmentATesting.logoutListener,FragmentBTesting.onCameraBack { 
ViewPager viewPager = null; 
SessionManager session = new SessionManager(MyApp.getContext()); 
int currFrag; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_fragment_activity_testing); 
    viewPager = (ViewPager) findViewById(R.id.pic_pager); 
    setStatusBarColor(); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    viewPager.setAdapter(new MyAdapter(fragmentManager)); 
    viewPager.setCurrentItem(1); 
    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction("CLOSE_ALL"); 
    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      finish(); 
     } 
    }; 
    registerReceiver(broadcastReceiver, intentFilter); 

} 
@TargetApi(21) 
public void setStatusBarColor() { 
    Window window = this.getWindow(); 
    // clear FLAG_TRANSLUCENT_STATUS flag: 
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 

    // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window 
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 

    if (Integer.valueOf(android.os.Build.VERSION.SDK) >= 21) { 
     window.setStatusBarColor(this.getResources().getColor(R.color.green)); 

    } 

} 

@Override 
public void logout() { 
    session.logOut(); 
    Intent a = new Intent(this,MainActivity.class); 
    startActivity(a); 
    Intent intent = new Intent("CLOSE_ALL"); 
    this.sendBroadcast(intent); 
    finish(); 
} 
@Override 
public void onBackPressed() { 
    if (currFrag == 0) { 

    } 
    else if (currFrag == 1) { 
     FragmentBTesting fragmentBTesting= new FragmentBTesting(); 
     fragmentBTesting.FragmentBBack(); 
    } 
} 


@Override 
public void onCameraBack(int i) { 
    currFrag = i; 
} 
} 

class MyAdapter extends FragmentStatePagerAdapter { 
public MyAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int position) { 
    Fragment fragment = null; 
    if (position ==0) { 
     fragment = new FragmentATesting(); 
    } 
    else if (position == 1) { 
     fragment = new FragmentBTesting(); 
    } 
    else if (position == 2) { 
     fragment = new FragmentCTesting(); 
    } 
    return fragment; 
} 

@Override 
public int getCount() { 
    return 3; 
} 

} 

回答

1

与其告诉你的活动,你目前对什么片段,为什么不告诉它被压回时执行什么?

在你的活动,你可以有一个字段来保存回调场(作为Runnable,我知道这么多恨。你可以让你自己的界面,如果你想),二传手,然后onBackPressed实施。这是我的代码中的一个代码片段。我使用番石榴的Optional类,但你可以null它,而不是如果你进入那种事情。

这是应该实现ActivityWithHomeButton

private Optional<? extends Runnable> backButtonListener = Optional.absent(); 

@Override 
public void onBackPressed() { 
    // Check if there is a custom back button 
    if (backButtonListener.isPresent()) { 
     backButtonListener.get().run(); 
     backButtonListener = Optional.absent(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

@Override 
public void setBackButtonListener(Optional<? extends Runnable> backButtonListener) { 
    this.backButtonListener = backButtonListener; 
} 

这里是接口I在活动

public interface ActivityWithHomeButton { 
    void setBackButtonListener(Optional<? extends Runnable> runnable); 
} 

,当然从一个片段

parent.setBackButtonListener(Optional.of(new Runnable() { 
     @Override 
     public void run() { 
      // do back button stuff 
     } 
    })); 

的使用实现活动你可以把它放在片段的任何位置。当您不再需要时,您也想要清除后退按钮侦听器()。你可以这样做,因为这样

parent.setBackButtonListener(Optional.<Runnable>absent()); 

哪里parent可以使用标准的活性片段通信赘述(http://developer.android.com/training/basics/fragments/communicating.html)模式来实现。此代码在你的片段

private ActivityWithHomeButton parent; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     parent = (ActivityWithHomeButton) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement ActivityWithHomeButton"); 
    } 
} 

希望它有帮助!

+0

有两个问题,父母是指最外面的布局?我应该清除onDestroy(),onPause()和onDestroyView()方法中的侦听器吗? – Alk

+0

而我的活动是为了实现ActivitywitHomeButton还是我的片段? – Alk

+0

Activity实现ActivityWithHomeButton。如果你需要监听器,只要显示片段,我相信你会想在#onPause(https:// lh3)中清除它。googleusercontent.com/-ePcpvCCqKgY/UhODSSrFHoI/AAAAAAAAAoI/D-ARz8gpkUA/w506-h930/android_fragment_lifecycle_complete.png)。充分披露:我不是活动/片段生命周期的专家,但这是我所说的。 –