我有一个托管DialogFragment的FragmentActivity.
DialogFragment执行网络请求并处理Facebook身份验证,因此我需要在轮换期间保留它.
我已经阅读了有关这个问题的所有其他问题,但没有一个问题能解决这个问题.
我正在使用putFragment和getFragment来保存Fragment实例,并在重新创建活动期间再次获取它.
但是,我总是在onRestoreInstanceState中调用getFragment时得到一个空指针异常.我还希望防止对话在轮换期间被解雇,但到目前为止,我甚至无法保留它的实例.
有什么想法会出错吗?
这是我的代码目前的样子:
public class OKLoginActivity extends FragmentActivity implements OKLoginDialogListener
{
private OKLoginFragment loginDialog;
private static final String TAG_LOGINFRAGMENT = "OKLoginFragment";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fm = getSupportFragmentManager();
if(savedInstanceState == null)
{
loginDialog = new OKLoginFragment();
loginDialog.show(fm, TAG_LOGINFRAGMENT);
}
}
@Override
public void onSaveInstanceState(Bundle outState)
{
getSupportFragmentManager().putFragment(outState,TAG_LOGINFRAGMENT, loginDialog);
}
@Override
public void onRestoreInstanceState(Bundle inState)
{
FragmentManager fm = getSupportFragmentManager();
loginDialog = (OKLoginFragment) fm.getFragment(inState, TAG_LOGINFRAGMENT);
}
}
Run Code Online (Sandbox Code Playgroud)
这是异常堆栈跟踪:
02-01 16:31:13.684: E/AndroidRuntime(9739): FATAL EXCEPTION: …Run Code Online (Sandbox Code Playgroud) android android-fragments android-dialogfragment android-fragmentactivity
我有一个LoginActivity(用户登录).它基本上是它自己Activity的主题就像一个对话框(看起来像一个对话框).它出现在一个SherlockFragmentActivity.我想要的是:如果登录成功,应该有两个FragmentTransaction更新视图.这是代码:
在LoginActivity,如果成功登录,
setResult(1, new Intent());
Run Code Online (Sandbox Code Playgroud)
在SherlockFragmentActivity:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 1) {
LoggedStatus = PrefActivity.getUserLoggedInStatus(this);
FragmentTransaction t = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
SherlockListFragment mFrag = new MasterFragment();
t.replace(R.id.menu_frame, mFrag);
t.commit();
// Set up Main Screen
FragmentTransaction t2 = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
SherlockListFragment mainFrag = new FeaturedFragment();
t2.replace(R.id.main_frag, mainFrag);
t2.commit();
}
}
Run Code Online (Sandbox Code Playgroud)
它在第一次提交时崩溃,使用此LogCat:
E/AndroidRuntime(32072): Caused by: java.lang.IllegalStateException: Can not perform this action …Run Code Online (Sandbox Code Playgroud) android android-intent android-activity android-fragmentactivity
在我尝试时,AsyncTask我从我的服务器获取电子邮件地址.在onPostExecute()我必须检查是电子邮件地址empty或null.我使用以下代码来检查它:
if (userEmail != null && !userEmail.isEmpty()) {
Toast.makeText(getActivity(), userEmail, Toast.LENGTH_LONG).show();
UserEmailLabel.setText(userEmail);
}
Run Code Online (Sandbox Code Playgroud)
但在我Toast看来null是印刷的.我的完整代码:
private class LoadPersonalData extends AsyncTask<String, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
protected Void doInBackground(String... res) {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("user_id", PrefUserName));
params.add(new BasicNameValuePair("type", type_data));
JSONObject json = jsonParser.makeHttpRequest(Url, "POST", params);
String result = "";
try {
result = json.getString("message");
} catch (JSONException e) {
e.printStackTrace();
}
if …Run Code Online (Sandbox Code Playgroud) 我有一个Sherlock片段活动,其中有3个片段.
片段A,片段B,片段C是三个片段.我想仅在片段B中显示完成选项菜单.
并且活动以片段A开始.当选择片段B时,添加完成按钮.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if(!menusInflated){
inflater.inflate(R.menu.security, menu);
menusInflated=true;
}
super.onCreateOptionsMenu(menu, inflater);
}
Run Code Online (Sandbox Code Playgroud)
当我再次启动Fragment AI想要选项菜单DONE(在片段B中设置)为此我就是这样做的
setHasOptionsMenu(false);
MenuItem item = (MenuItem) menu.findItem(R.id.done_item);
item.setVisible(false);
Run Code Online (Sandbox Code Playgroud)
但是这根本就没有隐藏,如果首次使用Fragment A启动Activity,它也会给出NullPointerException.
请告诉我这是什么问题.
我正在使用FragmentActivity和Fragments.
应用程序启动时:
FragmentActivity onCreate() <------
FragmentActivity onStart()
FragmentActivity onResume()
Fragment onAttach()
Fragment onCreate() <------
Fragment onCreateView()
Fragment onActivityCreated()
Fragment onStart()
Fragment onResume()
Run Code Online (Sandbox Code Playgroud)
一切都还可以,在Fragment onCreate()之前调用FragmentActivity onCreate().当我旋转:
Fragment onPause()
FragmentActivity onPause()
Fragment onStop()
FragmentActivity onStop()
Fragment onDestroyView()
Fragment onDestroy()
Fragment onDetach()
FragmentActivity onDestroy()
---
Fragment onAttach()
Fragment onCreate() <----------
FragmentActivity onCreate() <---------
Fragment onCreateView()
Fragment onActivityCreated()
Fragment onStart()
FragmentActivity onStart()
FragmentActivity onResume()
Fragment onResume()
Run Code Online (Sandbox Code Playgroud)
片段onCreate()在FragmentActivity onCreate()之前调用.为什么不一致?
在FragmentActivity onCreate()中,我生成了一些Fragment onCreate()得到的数据.由于这种奇怪的行为,我不得不将我的代码从Fragment onCreate()移动到Fragment onCreateView(),以确保我的数据之前已经生成过.
我正在使用FragmentStatePagerAdapter来保存Fragments,也许这就是原因?
android oncreate android-fragments android-fragmentactivity android-support-library
我正在更改我的Android移动应用程序,以支持平板电脑和手机.为此,我将我的活动类更改为片段.在我的activity类中,我有一个我的应用程序类的实例,如下所示:
appCtx = (UnityMobileApp) getApplication();
Run Code Online (Sandbox Code Playgroud)
UnityMobileApp我的Application类在哪里.
现在我想在我的片段类中创建相同的实例.你能帮我解决一下吗?
我的应用程序使用片段活动,它只处于纵向模式,无法旋转屏幕.
最初我使用的是这种commit()方法,但现在我计划不加区别地将这些更改commitAllowingStateLoss()为片段活动
如果不重新评估我使用片段的每个个案,是否有任何理由不得不加区分?
我的所有片段都通过ActionBarActivity(mainActivity)控制,在mainActivity DrawerLayout中实现,并且所有子片段都通过drawerLayout的列表项单击进行推送.我面临的问题是在通过抽屉推送片段之后我想将抽屉图标更改为后退图标,ToolBar以便用户可以导航到上一个片段并处理android.R.id.home同一片段内或mainActivity内部的回调.
我使用的代码是:
MainActivity.java
public class MainActivity extends ActionBarActivity {
private DrawerLayout layoutDrawer;
private ActionBarDrawerToggle drawerToggler;
private Stack<Fragment> stack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
stack = new Stack<Fragment>();
layoutDrawer = (DrawerLayout) findViewById(R.id.layout_drawer);
drawerToggler = new ActionBarDrawerToggle(this, layoutDrawer, toolbar,
R.string.app_name, R.string.app_name);
layoutDrawer.setDrawerListener(drawerToggler);
setUpDrawerList();
pushFragment(new FirstFragment(), true);
Session.setContext(getApplicationContext());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) { …Run Code Online (Sandbox Code Playgroud) android android-actionbar android-fragmentactivity navigation-drawer android-toolbar
我正在使用内置的导航抽屉来运行我的应用程序.我无法弄清楚如何处理后退按钮.当它被按下时,我希望它再次加载第一个片段.片段1.
因此,当应用程序启动时,您会看到Fragment1已启动.然后,他们可以点击片段2-5转到其他页面.在所有这些页面中,我希望使用后退按钮将用户带回Fragment1.用户应该能够通过后退按钮退出应用程序的唯一位置是Fragment1.
所有这些都是由FragmentActivity处理的,我试着弄乱那里的后门按钮.然而,我一直收到一个强制关闭错误:
(01-11 14:09:33.114: E/AndroidRuntime(8292): android.view.InflateException: Binary XML file line #7: Error inflating class fragment)
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止:
我确保将片段添加到后台堆栈中,如下所示:
fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();
Run Code Online (Sandbox Code Playgroud)
返回键:
@Override
public void onBackPressed() {
if (getSupportFragmentManager().findFragmentByTag("fragBack") != null) {
}
else {
super.onBackPressed();
return;
}
if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
Toast.makeText(getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
Fragment frag = getSupportFragmentManager().findFragmentByTag("fragBack");
FragmentTransaction transac = getSupportFragmentManager().beginTransaction().remove(frag);
transac.commit();
}
}
Run Code Online (Sandbox Code Playgroud)
有谁知道我需要做什么?我是否需要在每个片段中调用onBackPressed(如果可能的话),而不是控制抽屉的FragmentActivity?在我过去的应用程序中,无论用户使用哪个片段,我都可以使用后退按钮关闭应用程序但是我现在正在制作的那个片段我希望后退按钮返回到Fragment1.
非常感谢一些帮助,谢谢.
onItemClick
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Fragment newFragment = new MapsPage();
FragmentManager fm = getSupportFragmentManager(); …Run Code Online (Sandbox Code Playgroud) android android-fragments android-fragmentactivity navigation-drawer
我正在研究Android应用程序,我想使用3个选项卡为每个选项卡使用Fragments进行导航,但我不知道如何创建这样做的结构.
我想分别添加每个片段,因为每个片段都不同,但我不知道在FragmentActivity中将它们添加到何处.
我有这些文件.
tabs_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent">
<TabHost android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<FrameLayout
android:id="@+id/tabRateAPet"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<FrameLayout
android:id="@+id/tabViewMyRates"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<FrameLayout
android:id="@+id/tabViewGlobalRates"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</FrameLayout>
</LinearLayout>
</TabHost>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
TabsMain.java
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
public class MainTabsActivity extends FragmentActivity {
public static final String RATE_A_PET = "Rate a Pet";
public static final String MY_RATES = "My Rates";
public static final …Run Code Online (Sandbox Code Playgroud) android android-tabhost android-fragments android-fragmentactivity