我正在制作一个使用蓝牙连接的应用程序.我打电话蓝牙连接onCreate()和关闭它onDestroy()的MainActivity:
// Bluetooth
private Bluetooth bt;
private boolean registered = false;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = new Bluetooth(this);
bt.enableBluetooth();
bt.setCommunicationCallback(this);
bt.connectToName(bt.getBluetoothDevice(this));
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mReceiver, filter);
registered = true;
}
@Override
public void onDestroy() {
super.onDestroy();
if(registered) {
unregisterReceiver(mReceiver);
registered=false;
}
bt.removeCommunicationCallback();
bt.disconnect();
if (handler != null && runnable != null) {
handler.removeCallbacks(runnable);
}
}
Run Code Online (Sandbox Code Playgroud)
该应用程序还支持LANDSCAPE和PORTRAIT模式(使用两种不同的布局).当屏幕旋转时,由于布局不同,MainActivity调用onCreate()和onDestroy功能.出于这个原因,我收到以下错误:
@@@ ABORTING: INVALID HEAP ADDRESS …Run Code Online (Sandbox Code Playgroud) sockets android bluetooth android-activity android-bluetooth
我正在使用DialogFragment在onCreateDialog()中返回DatePickerDialog.我已将dateSetListener设置为DialogFragment(下面的示例中为"this"),除了在屏幕旋转发生时调用onDateSet()时,一切正常,这是不可取的.如何在旋转屏幕时让onDateSet不被调用?
我的DialogFragment
public static class DateDialogFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener{
public static DateDialogFragment newInstance() {
return new DateDialogFragment();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new DatePickerDialog(getActivity(), this, 2012, 11, 19);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
//This is called when screen rotated, which I dont want
Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show();
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我所说的
if(getActivity()!=null){
FragmentManager fm = getActivity().getSupportFragmentManager();
DialogFragment newFragment = DateDialogFragment.newInstance();
newFragment.show(fm, "dialog");
}
Run Code Online (Sandbox Code Playgroud) 上下文:我有Activitya Fragment和3 InnerFragments.当Fragment onDestroy()被调用时,我想从取下内片段FragmentManager.代码来自onDestroy()下方.
问题: FragmentManager投掷NullPointerException,可能在commitAllowingStateLoss()被调用时.我不明白为什么.
@Override
public void onDestroy()
{
super.onDestroy();
if (getFragmentManager().findFragmentById(R.id.fragment_framelayout_left) != null)
{
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.remove(mLeftFragment);
fragmentTransaction.commitAllowingStateLoss();
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
02-11 12:15:14.162: E/AndroidRuntime(25911): FATAL EXCEPTION: main
02-11 12:15:14.162: E/AndroidRuntime(25911): java.lang.NullPointerException
02-11 12:15:14.162: E/AndroidRuntime(25911): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1419)
02-11 12:15:14.162: E/AndroidRuntime(25911): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
02-11 12:15:14.162: E/AndroidRuntime(25911): at android.os.Handler.handleCallback(Handler.java:725)
02-11 12:15:14.162: E/AndroidRuntime(25911): at android.os.Handler.dispatchMessage(Handler.java:92)
02-11 12:15:14.162: E/AndroidRuntime(25911): at android.os.Looper.loop(Looper.java:137)
02-11 12:15:14.162: E/AndroidRuntime(25911): …Run Code Online (Sandbox Code Playgroud) 在我的活动中,我使用以下代码添加了片段.
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.right_to_left_in, R.anim.right_to_left_exit,R.anim.left_to_right_in,R.anim.left_to_right_exit);
DetailsFragment newFragment = DetailsFragment.newInstance();
ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");
ft.commit();
Run Code Online (Sandbox Code Playgroud)
片段正在进入,退出,正确播放动画.但是当我定位设备时,片段管理器正在尝试使用相同的动画添加片段.这看起来很奇怪.当用户定位设备时,我不想要动画.
我不想添加onConfigChanges='orientation'清单,因为我想在方向上更改片段的布局设计.
我写的应用程序有3个片段.当我按下搜索按钮时,主片段活动有一个带搜索按钮的搜索框,调用下面的函数:
Fragments.values()[tabControl.getCurrentItem()].getFragment().search(tv.getText().toString(), MainActivity.this.getApplicationContext());
Run Code Online (Sandbox Code Playgroud)
一切正常,直到我按下HOME按钮等待30分钟并重新启动应用程序,在我按下FragmentYellowPagesFragment应用程序中的搜索按钮后崩溃
lvYellowPages.setVisibility(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)
因为lvYellowPages在这种情况下是null,但在日志中我可以看到该onCreateView函数被调用.能帮帮我吗,我可以和你分享我的代码.
public class FragmentAdapter extends FragmentPagerAdapter {
Fragments[] mFragments;
public FragmentAdapter(FragmentManager fm) {
super(fm);
mFragments = Fragments.values();
}
public enum Fragments {
Favorites(App.getStringByResId(R.string.favorites), new FragmentFavorites()),
Categories(App.getStringByResId(R.string.categories), new FragmentCategories()),
YellowPages(App.getStringByResId(R.string.yellow_pages), new FragmentYellowPages());
Fragments(String title, BaseListFragment fragment) {
this.mTitle = title;
this.mFragment = fragment;
}
String mTitle;
BaseListFragment mFragment;
public String getTitle() {
return mTitle;
}
public BaseListFragment getFragment() {
return mFragment;
}
};
@Override
public CharSequence getPageTitle(int position) …Run Code Online (Sandbox Code Playgroud) 嗨,我有一个关于在重新创建Activity时保留片段的问题。我听说一种方法是在onCreate方法中使用setRetainFragment(true)。问题是-与在Activity中跟踪私有Fragment属性有什么不同,以便在活动的整个生命周期中我始终拥有相同的Fragment对象?谢谢!
我的应用程序有一个对话框和两个活动,风景和肖像.
当我在其中一个活动中并且在对话框打开时旋转屏幕时,应用程序崩溃.
我应该怎样处理那不会发生的事情?
这是logcat输出:(空格表示事情开始向南)
11-15 15:56:25.322: D/AndroidRuntime(956): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
11-15 15:56:25.322: D/AndroidRuntime(956): CheckJNI is ON
11-15 15:56:26.342: W/ThrottleService(77): unable to find stats for iface rmnet0
11-15 15:56:26.382: D/AndroidRuntime(956): Calling main entry com.android.commands.pm.Pm
11-15 15:56:26.442: D/AndroidRuntime(956): Shutting down VM
11-15 15:56:26.452: D/dalvikvm(956): GC_CONCURRENT freed 101K, 78% free 463K/2048K, paused 1ms+1ms
11-15 15:56:26.462: D/dalvikvm(956): Debugger has detached; object registry had 1 entries
11-15 15:56:26.472: I/AndroidRuntime(956): NOTE: attach of thread 'Binder Thread #3' failed
11-15 15:56:27.112: D/AndroidRuntime(969): >>>>>> AndroidRuntime START …Run Code Online (Sandbox Code Playgroud) 我的应用程序包含几个片段.到目前为止,我已将它们的引用存储在自定义的Application对象中,但我开始认为我做错了.
当我意识到我的片段对mActivity的所有引用在方向改变后变为null时,我的问题就开始了.因此,当我在方向更改后调用getActivity()时,会抛出NullPointerException.我已经检查过我的片段的onAttach()在调用getActivity()之前被调用,但它仍然返回null.
以下是我的MainActivity的剥离版本,它是我的应用程序中唯一的活动.
public class MainActivity extends BaseActivity implements OnItemClickListener,
OnBackStackChangedListener, OnSlidingMenuActionListener {
private ListView mSlidingMenuListView;
private SlidingMenu mSlidingMenu;
private boolean mMenuFragmentVisible;
private boolean mContentFragmentVisible;
private boolean mQuickAccessFragmentVisible;
private FragmentManager mManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* Boolean variables indicating which of the 3 fragment slots are visible at a given time
*/
mMenuFragmentVisible = findViewById(R.id.menuFragment) != null;
mContentFragmentVisible = findViewById(R.id.contentFragment) != null;
mQuickAccessFragmentVisible = findViewById(R.id.quickAccessFragment) != null;
if(!savedInstanceState != null) {
if(!mMenuFragmentVisible && mContentFragmentVisible) { …Run Code Online (Sandbox Code Playgroud) 我是使用Xamarin.Android进行Android开发的新手,我想了解如何解决下一个问题.
有时,从后台恢复我的Android应用程序后,我面临的下一个错误:
Unable to find the default constructor on type MainMenuFragment.在MainMenuFragment使用应用程序NavigationDrawerActivity允许用户在应用程序中不同的片段之间切换.
为了解决这个问题,我MainMenuFragment在下一个链接中添加了一个默认构造函数:
public class MainMenuFragment : DialogFragment
{
readonly NavigationDrawerActivity navigationDrawer;
#region Constructors
public MainMenuFragment () {} // Default constructor...
public MainMenuFragment (NavigationDrawerActivity navigationDrawer, IMenuType launchMenu = null)
{
if (navigationDrawer == null)
throw new ArgumentNullException ("navigationDrawer");
this.navigationDrawer = navigationDrawer;
...
Fragment UpdateTopFragmentForCurrentMenu (Fragment newMenuRootFragment = null)
{
Fragment currentMenuRootFragment = navigationDrawer.CurrentFragment; // issued line.
Run Code Online (Sandbox Code Playgroud)但是现在在将来的某个时候,MainMenuFragment使用其默认构造函数初始化,并且在第一次尝试访问其navigationDrawer时,它会抛出System.NullReferenceException:
System.NullReferenceException: …Run Code Online (Sandbox Code Playgroud) 我有一个ViewPager活动,在ViewPager适配器中我为每个位置提供Fragment.
一个示例Fragment是DebugFragment.我在下面写了源代码.
public class DebugFragment extends android.support.v4.app.Fragment {
private OnFragmentInteractionListener mListener;
public interface OnFragmentInteractionListener {
void onFragmentInteraction(int someValue);
}
public static DebugFragment newInstance() {
DebugFragment fragment = new DebugFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mListener.onFragmentInteraction(0);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LocalBroadcastManager.getInstance(getContext()).registerReceiver(mMessageReceiver,
new IntentFilter("com.android.example.INITIAL_REQUEST"));
}
@Override
public void onDestroy() {
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
@Override
public void onAttach(Context context) …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-fragments android-fragmentactivity fragment-lifecycle
我没有在我的片段中保存任何上下文,所以我setRetainInstance(true)在UI片段中使用.谁能告诉我这是否是正确的方法?我们应该在哪里基本上调用setRetainInstance方法?我的意思onCreate还是onActivityCreated等