Articles of android fragments

Android上的Dagger 2:在Activity中注入相同的依赖项并保留Fragment

我有类F1和F2对象,我想在保留的片段中注入。 我还有一个依赖于Activity的A类对象,我希望它被注入到该Activity中,并且附加到该Activity的Fragment Manager中的保留Fragment中。 我写下面的代码。 首先,Activity依赖的模块: @Module public class MainActivityModule { private Activity mActivity; public MainActivityModule(Activity activity) { mActivity = activity; } @Provides @ActivityScope public A provideA() { return new A(mActivity); } } 然后,相应的组件必须使A对象可用于其依赖组件: @ActivityScope @Component(modules = {MainActivityModule.class}) public interface MainActivityComponent { void inject(MainActivity activity); // make the A object available to dependent components A getA(); […]

嵌套的scrollview会自动滚动到底部

我在NestedScrollView中有一个GridView。 每当GridView的内容发生变化时,我都使用下面的代码来调整GridView的大小。 这工作正常,但是当我从应用程序的片段3滑回到片段2(NestedScrollView所在的位置)时,NestedScrollView滚动到最底部。 奇怪的是,当从片段1滑动到片段2时不会发生这种情况。 在调整GridView大小后,它也不会直接发生。 如何通过滚动到底部来压制NestedScrollView? private static void resizeGridView(GridView gridView, int items, int columns) { ViewGroup.LayoutParams params = gridView.getLayoutParams(); params.height = singleGridHeight * items; gridView.setLayoutParams(params); gridView.requestLayout(); } 在片段之间滑动时会调用以下系统方法:

如果在webview中存在触摸事件,则停止触摸事件被ViewPager拦截

我有一个显示片段页面的ViewPager 。 每个片段都是显示脱机网站的WebView。 其中一些webview中包含javascript滑动事件,以使它们正常工作。 我想实现这样的,如果webview没有滑动事件(在javascript中),那么触摸事件将被传递到ViewPager ,否则它将被webview使用。 我试过覆盖ViewPagers @Override public boolean onInterceptTouchEvent(MotionEvent event) { return (this.swipeable) ? super.onInterceptTouchEvent(event) : false; } 然而,这阻止了ViewPager可以滑动(如预期的那样),但也阻止了滑动事件到达webview,因此我有两个不希望的结果。 是否有任何方法可以先将触摸事件传递给webView,然后如果片段中没有将其传递回ViewPager ? 如果我在MyViewPager犯了错误,我MyViewPager得到以下代码: public class MyViewPager extends ViewPager implements GestureDetector.OnGestureListener { private static final String TAG = MyViewPager.class.getSimpleName(); private boolean swipeable = true; private float lastX = 0; private long lastTime = 0 ; […]

如何选择导航抽屉中的第一项并在应用程序启动时打开片段

我用NavigationView创建了MainActivity 。 当Activity打开时,我想自动选择导航抽屉中的第一个项目,然后打开该项目下的Fragment 。 我搜索了很多,但没有find任何适当的解决方案。 这样做的正确方法是什么? Main Activity : public class MainActivity extends AppCompatActivity implements Config { private NavigationView navigationView; private DrawerLayout drawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); toolbar.setTitleTextColor(getResources().getColor(R.color.colorIcons)); if (null != getSupportActionBar()) getSupportActionBar().setLogo(R.drawable.ic_blogger_white); //Start PostListFragmentWebView /*PostListFragmentWebView postListFragmentWebView = new PostListFragmentWebView(); getSupportFragmentManager().beginTransaction() .replace(R.id.frame, postListFragmentWebView) .commit();*/ //Initializing […]

片段中的GreenRobot EventBus错误:没有订阅者注册事件类

我有一个活动,它的布局包含一个FrameLayout。 我使用framelayout作为片段容器。 我使用FragmentManager事务替换FrameLayout中的片段。 在片段的onCreate方法之一中,我使用EventBus注册片段。 @Override public void onCreate(){ EventBus.getDefault().register(this); // other initialization code } 该片段在其布局中具有GridView。 每当点击gridView中的项目时,我都会将事件发布到EventBus @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){ View rootView = inflater.inflate(R.layout.fragment_category, container, false); gridView = (GridView) rootView.findViewById(R.id.categry_grid_view); gridAdapter = new CustomGridAdapter(getActivity()); gridView.setAdapter(gridAdapter); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { Category clickedCategory […]

WebView未加载网页

我正在使用WebView加载网站。 但它非常慢,并且在加载特定网站时会泄漏。 我正在使用以下代码加载WebView 。 @Override protected void onNewIntent(Intent intent) { if (intent.getStringExtra(“url”) != null) { webView.loadurl(intent.getStringExtra(“url”)); } } 但我正在调用webView.loadUrl(Config.URL); 使用以下内容初始化WebView后, onCreate()方法中的( Config.URL可能包含与上面指定的相同的url)。 this.webView = (WebView) findViewById(R.id.wv); this.webView.getSettings().setJavaScriptEnabled(true); this.webView.getSettings().setLoadsImagesAutomatically(true); this.webView.getSettings().setDomStorageEnabled(true); this.webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); MyClient client = new MyClient(WebActivity.this, (ProgressBar)findViewById(R.id.progressBar)); webView.setWebViewClient(client); 从onCreate()加载一个正常工作(不好,它太慢)。 但是从onNewIntent()加载的相同URL 无法正常工作! 。 在onNewIntent()中onNewIntent()此操作后,没有使用onNewIntent()加载URL,并且当前页面变得不可移动。 即。 滚动条在WebView中移动但页面不滚动。 我在onCreate()测试了相同的URL并且它正在工作。 为此,我正在通过url intent.putExtra(“url”, Config.URL+targetUrl); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); 具有来自通知的未决意图。 虽然它在一些设备上工作,即Google Nexus。 但它并不适用于大多数手机。 […]

Android FragmentTransaction.addToBackStack混乱

我正在研究片段,并且很难区分FragmentTransaction.replace(id, fragment, tag)和FragmentTransaction.addToBackStack(tag)调用。 让我们说我当前的片段是FragmentA然后我加载了FragmentB 。 我希望将来,当我需要加载FragmentA时 ,我不必重新加载它。 只需在旧状态下加载旧的。 我使用了以下代码段: public void loadFragment(Fragment fragmentB, String tag) { FragmentManager fm = getSupportFragmentManager(); View fragmentContainer = findViewById(R.id.fragment_container); FragmentTransaction ft = fm.beginTransaction(); ft.replace(fragmentContainer.getId(), fragmentB, tag); ft.addToBackStack(tag); ft.commit(); } 现在我很困惑,我应该在哪里添加字符串标签? 在replace()或addToBackStack()或两个调用中? 你能解释这两个标签位置之间的区别吗?

java.lang.IllegalStateException:失败保存状态:active已清除片段中的索引

首先,我的应用程序具有以下结构: SpashActivity -> MainActivity -> switching between many fragments 我的应用程序使用SlideMenu在片段之间切换。 我必须使用attach而不是replace来保持片段状态。 它看起来像: public void switchContent(int index, String fragmentTag) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); if (fragmentManager.findFragmentByTag(fragmentTag) != mContent) { if (!mContent.isDetached()) { transaction.detach(mContent); } if (null == fragmentManager.findFragmentByTag(fragmentTag)) { switch (index) { case 0: mContent = new CategoryFragment(); break; case 1: mContent […]

即使使用FragmentTransaction.addToBackStack(),后退按钮关闭应用程序

我在stackoverflow上读到的其他问题都没有能够解决我的问题。 据我所知,我正在做的一切正确。 我有一个带片段的主/细节流。 创建主活动后,主片段将加载以下代码: Fragment frag; frag = new MainListFragment();//<– **the master fragment** FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); transaction.replace(R.id.fragment_container, frag); Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount()); transaction.commit(); 主片段有一个ListView ; 单击列表项会显示详细信息片段,如下所示: @Override public void onListItemClick(ListView listView, View view, int position, long id) { super.onListItemClick(listView, view, position, id); FragmentManager fm = getFragmentManager(); FragmentTransaction transaction […]

Android – 使用GoogleMaps API 2.0的SupportMapFragment提供IllegalArgumentException

我正在尝试使用为Android提供的最新Map API 2.0。 我正在使用支持库,因为我想支持Android 2.2。 以下是我的代码: 主要活动类 public class MainActivity extends FragmentActivity { public FragmentManager fManager ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fManager = getSupportFragmentManager(); Button showMapButton = (Button) findViewById(R.id.showMapButton); showMapButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { loadMapFragment(); } }); } private void loadMapFragment() { MapPageFragment plotterFragment = new MapPageFragment(); […]