好的,这是我的问题:
我想使用 fragment 实现 Chrisbanes ActionBar-PullToRefresh 库,以便能够将其与 Navigationdrawer 一起使用。
https://github.com/chrisbanes/ActionBar-PullToRefresh#fragments
.
Chrisbanes 说这是为了与 fragment 一起使用:
One thing to note is that the PullToRefreshAttacher needs to be created in the onCreate() phase of the Activity. If you plan on using this library with Fragments then the best practice is for your Activity to create the PullToRefreshAttacher, and then have your fragments retrieve it from the Activity.
An example is provided in the Fragment & Tabs sample.
.
.
****问题来了: 我在我的 Activity 中创建了 PullToRefreshAttacher,但我怎么能把 PullToRefreshAttacher 传递给我的 fragment :S ****
我已经阅读了很多关于 bundle 和 getArguments() with putSerializable 和 Parcelable 的文章:
而且我还读了这篇文章,其中某事。像这样使用 ((MyActivity ) getActivity()).getClassX() ;。
但我没有真正理解/工作过。 :(
.
.
这是 NavigationActivity 和一个示例 fragment 。我不得不说我是 android/Java 的新手:)
final String[] menuEntries = {"Start","Datum","Website","Kunden"};
final String[] fragments = {
"com.blabla.MainFragment",
"com.blabla.OneFragment",
"com.blabla.TwoFragment",
"com.blabla.KundenFragment",
};
private ActionBarDrawerToggle drawerToggle;
private DrawerLayout drawerAdapter;
private ListView navListAdapter;
private PullToRefreshAttacher mPullToRefreshAttacher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.navigation_layout);
mPullToRefreshAttacher = PullToRefreshAttacher.get(this);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActionBar().getThemedContext(), android.R.layout.simple_list_item_1, menuEntries);
final DrawerLayout drawer = (DrawerLayout)findViewById(R.id.refresh_navwiev);
final ListView navList = (ListView) findViewById(R.id.drawerMenu);
drawerAdapter=drawer;
navListAdapter=navList;
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
drawerToggle = new ActionBarDrawerToggle(
this,
drawer,
R.drawable.navicon,
R.string.drawer_open,
R.string.drawer_close
) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
}
};
drawer.setDrawerListener(drawerToggle);
navList.setAdapter(adapter);
navList.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, final int pos,long id){
drawer.setDrawerListener( new DrawerLayout.SimpleDrawerListener(){
@Override
public void onDrawerClosed(View drawerView){
super.onDrawerClosed(drawerView);
//Runs On completly Closed
}
});
//Runs Onclick if not same fragment
if(getActionBar().getTitle()!= menuEntries[pos])
{
Bundle bundle=new Bundle();
bundle.putString("message", "From Activity");
//Fragment zusammenbauen
Fragment myFragment=new Fragment();
myFragment = Fragment.instantiate(NavigationActivity.this, fragments[pos]);
myFragment.setArguments(bundle);
FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
tx.setCustomAnimations(R.anim.fragmentfadein, R.anim.fragmentfadeout);
tx.replace(R.id.navigationScreen, myFragment);
tx.commit();
getActionBar().setTitle(menuEntries[pos]);
drawer.closeDrawer(navList);
}
}
});
Bundle bundle=new Bundle();
// bundle.putInt(PullToRefreshAttacher., position);
//Fragment zusammenbauen
Fragment myFragment=new Fragment();
myFragment = Fragment.instantiate(NavigationActivity.this, fragments[0]);
myFragment.setArguments(bundle);
FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
tx.setCustomAnimations(R.anim.fragmentfadein, R.anim.fragmentfadeout);
tx.replace(R.id.navigationScreen, myFragment);
tx.commit();
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
Log.i("FlosTemplate", "Menu Taste Gedrückt");
if(drawerAdapter.isDrawerOpen(navListAdapter))
{
drawerAdapter.closeDrawer(navListAdapter);
}
else
{
drawerAdapter.openDrawer(navListAdapter);
}
return true;
}
return super.onKeyUp(keyCode, event);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
还有一个 fragment
public class MainFragment extends Fragment {
public static Fragment newInstance(Context context) {
MainFragment f = new MainFragment();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
}
如果有人能帮助我,那将是非常友好的,我被困在这一点上好几天了:)
附言对不起,我的语言可能不好,我不是母语人士;)
最佳答案
GitHub页面上有演示代码:
将此添加到您的 Activity 中:
public PullToRefreshAttacher getPullToRefreshAttacher() {
return mPullToRefreshAttacher;
}
这对你的 fragment 中的 onCreateView:
PullToRefreshAttacher mPullToRefreshAttacher = ((NavigationActivity) getActivity()).getPullToRefreshAttacher();
更好的方法是使用接口(interface),但我建议从 GitHub 示例开始。
关于android - 适配chrisbanes Action Bar-Pull To Refresh to Fragments(Navigation Drawer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18255025/