Articles of android fragments

如何协调两个后台任务?

我在片段中运行了2个AsyncTasks。 AsyncTasks在不同的类中定义,而不是片段的内部私有类。 我遇到的问题是,现在我需要让AsyncTaskX等到AsyncTaskY完成其onPostExecute 我怎么解决这个问题? 我正在考虑使用倒计时,但是AsyncTaskY在不同的类中,我不确定这是什么最好的编码方式? 有没有办法检查AsyncTask是否完全完成? 更新: 我想知道在task.execute().get()之后是task.execute().get()返回吗? 更新2: 从UI线程安全调用CountDownLatch.countDown() ?

addToBackStack()不起作用

我有我的MainActivity管理两个一起工作的片段。 我的一个方法是ListFragment上的监听器接口,MainActivity负责切换片段。 但由于某些原因,似乎addToBackStack不起作用。 当我点击列表时,转到下一个片段并点击设备的后退按钮……它只是在设备主屏幕上的应用程序之外。 谁知道问题是什么? @Override public void OnSelectionChanged(Object object) { DetailFragment DetailFragment = (DetailFragment) getFragmentManager().findFragmentById(R.id.detail_fragment); if (DetailFragment != null) { DetailFragment.setTitle(object); } else { DetailFragment newDetailFragment = new DetailFragment(); Bundle args = new Bundle(); args.putSerializable(DetailFragment.KEY_POSITION,object); newDetailFragment.setArguments(args); FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, newDetailFragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } }

设置ActionBar颜色时的Android UI故障

我和朋友一起创建了一个Android应用程序,我有一个与UI相关的奇怪问题。 当在片段之间切换时,有时UI倾向于加扰,创建下面显示的故障。 它发生在我的带有Dalvik运行时的Nexus 5和Android的股票以及我的朋友的带有ART运行时和SlimKat rom的Nexus 4上。 但是在具有Dalvik运行时和4.4.2(AOSB rom)的另一个Nexus 5上无法观察到。 奇怪的是,在我更新到应用程序的最新版本之前,它没有发生。 下面是使用的布局,其中main_fragment是我使用事务放置Fragment的地方。 我发现执行此行时会出现故障,并且我在setBackgroundDrawable方法中放置的内容无关紧要: activity.getActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor(getCurrentTheme(activity)))); 还有人有这个问题吗? 或者也许有人知道解决方法或如何使其工作? 编辑:我需要在运行时更改ActionBar颜色(在应用程序设置中更改主题)。

FragmentManager.getFragment()NullPointerException

我正在使用支持库v4并且无法保存片段的状态。 @Override protected void onSaveInstanceState(Bundle outState) { … if(mFragment != null) getSupportFragmentManager().putFragment(outState, “frag”, mFragment); … } @Override protected void onCreate(Bundle savedInstanceState) { … if(savedInstanceState != null) { //Here I get NullPointerException getSupportFragmentManager().getFragment(savedInstanceState, “frag”); } … } 当我调用getFragment()时抛出NullPointerException(savedInstanceState包含带有“frag”的条目)。 这是logcat输出的一部分: 04-18 00:10:56.719: E/AndroidRuntime(14644): Caused by: java.lang.NullPointerException 04-18 00:10:56.719: E/AndroidRuntime(14644): at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:569) 我也尝试调用返回null getFragments() 。 这在我看来很奇怪。 我将不胜感激! 解: […]

单击操作栏中的“向上”时主/详细流程中的空意图(nullpointerexception)

这可能是一个冗长的post,所以我提前道歉。 我正在使用主/详细信息流来显示项目列表,单击它时会打开详细信息视图。 这些项目是从Web服务加载的。 它在平板电脑上运行很好,但在手机上却不断崩溃。 它可以正确显示项目详细信息(CheatViewPageIndicator.java),但是当我使用操作栏左上角的“向上”按钮返回父活动(CheatListActivity.java)时,应用程序会一直崩溃并返回nullpointerexception。 我想我正在从错误的位置加载来自webservice的数据,这就是它崩溃的原因。 我打算在这里编写我的代码,希望有人可以给我一个建议,告诉我如何以正确的方式做到这一点。 (我稍微调整了一下课程以缩短post。) “主”活动: public class CheatListActivity extends FragmentActivity implements CheatListFragment.Callbacks, ReportCheatDialogListener, RateCheatDialogListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cheat_list); settings = getSharedPreferences(Konstanten.PREFERENCES_FILE, 0); editor = settings.edit(); cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); cheatProgressDialog = ProgressDialog.show(this, getString(R.string.please_wait) + “…”, getString(R.string.retrieving_data) + “…”, true); handleIntent(getIntent()); if (findViewById(R.id.cheat_detail_container) != null) { // […]

失败保存状态:活动SupportMapFragment {}已清除索引:-1

我正在使用supportMapFragment里面片段这就是为什么我使用this.getChildFragmentManager this.getChildFragmentManager()如果这个错误请指导我 public static ClinicFragment newInstance() { ClinicFragment fragment = new ClinicFragment(); return fragment; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); setTargetFragment(null , -1); // one of my tries } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.activity_maps, null, false); Log.i(TAG , “onCreateView”); mapFragment = (SupportMapFragment) this.getChildFragmentManager() […]

在startIntentSenderForResult之后没有调用OnActivityResult

我正在使用启动页面“使用Google登录”。 当用户有多个帐户时…在他们选择要登录的帐户后,我正在尝试启动应用程序主要活动,但由于某种原因,我的片段中从不调用onActivityResult 。 在Activity中,我调用onActivityResult并让它调用super以便片段可以处理它,但它永远不会触发。 有什么建议么? 这是有问题的片段: package com.garciaericn.goodeats.login; import android.app.Activity; import android.app.Fragment; import android.content.Intent; import android.content.IntentSender; import android.os.Bundle; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.garciaericn.goodeats.R; import com.garciaericn.goodeats.helpers.CheckConnection; import com.garciaericn.goodeats.main.FavoritesActivity; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.SignInButton; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.plus.Plus; public class LoginFragment extends Fragment implements View.OnClickListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { public static final […]

在Android上的ViewPager中替换当前片段

我有一个ViewPager ,如果发生某个动作,我必须替换第一个Fragment 。 public static class PagerAdapter extends FragmentStatePagerAdapter{ private TempChannel latestChannel; private VideosFragment.SortType sortType; public PagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position){ case 0: if(latestChannel == null) { return new LatestVideosFragment(); }else{ return VideosFragment.getVideosFragment(latestChannel, sortType); } case 1: return new LiveVideosFragment(); case 2: return new ConversationsFragment(); } return […]

ViewPager里面的片段

我正在尝试使用新的Android支持设计库将一个viewpager添加到一个片段。 我有布局的xml代码,如下所示: 相应的java类如下: public class Tracks extends Fragment { ViewPager viewPager; TabLayout tabLayout; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tracks, container, false); viewPager = (ViewPager) view.findViewById(R.id.viewpager); tabLayout = (TabLayout) view.findViewById(R.id.tabLayout); AppCompatActivity activity = (AppCompatActivity) getActivity(); assert activity.getSupportActionBar() != null; activity.getSupportActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.app_theme))); return view; } @Override public void […]

android恢复在backstack中的片段的实例状态

嗨我有一个有两个片段的活动。 片段A. 片段B 片段A有一个EditText和一个ListView。 一旦我在EditText中输入内容并按Enter键 ,我就会填充ListView。 现在片段A的ListView填充了数据。 单击片段A的ListView上的任何项将将用户发送到片段B. 此时我正在用片段B替换片段A. 因此,当用户按下后退按钮时,他会回到片段A 现在问题是如果用户在片段B中并且配置更改发生像屏幕旋转等不止一次那么我的ListView是空的因为我的arraylist是null。 请注意,我在片段A和片段B中使用onSavedInstanceState。如果我的当前片段是片段A并且发生配置更改,那么恢复状态就没有问题,因为在onCreateView中我从bundle获取了arraylist。 我知道当我从片段B回到之前在后台堆栈中的片段A时,我的arraylist为空的原因。当片段A在backstack中时,被调用的唯一方法是onSaveInstanceState,所以在第一次配置更改后我的arraylist字段为null因为我无法将存储在savedInstateState包中的arraylist分配给arraylist字段。 我不想在清单中使用android:configchanges属性。 我的问题是如何恢复backstack中片段的状态。