我正在使用Fragments其中一个创建一个应用程序,我创建了一个非默认构造函数并得到了这个警告:
Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么这不是一个好主意?
你能否建议我如何做到这一点:
public static class MenuFragment extends ListFragment {
public ListView listView1;
Categories category;
//this is my "non-default" constructor
public MenuFragment(Categories category){
this.category = category;
}....
Run Code Online (Sandbox Code Playgroud)
不使用非默认构造函数?
我们正在使用Fragments,我们不需要在重新创建Activity时自动恢复它们.但每当调用Activity::onCreate(Bundle savedInstanceState)- > 时super.onCreate(savedInstanceState),即使我们对这些片段使用setRetainInstance(false),也会恢复片段.
而且,在那些Fragments Fragment.performCreateView()被直接调用而不经过Fragment::onAttach()等等.另外,一些字段在恢复内部为空Fragment...
有谁知道如何阻止Android恢复片段?
PS我们知道,如果为配置更改重新创建活动,可以通过添加到清单a来完成ndroid:configChanges="orientation|screenSize|screenLayout.但是在自动内存清理的情况下重新创建活动呢?
android garbage-collection memory-management fragment recreate
我在这里按照教程:http: //developer.android.com/guide/topics/ui/controls/pickers.html
我得到了工作,日期选择器出现了.但是,我被困在如何在用户设置日期时采取行动.
我看到他们有这种方法:
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在其中添加任何代码,则无效.
我不熟悉Java所以我不确定需要哪些额外的代码来更新具有所选日期的textview.
我确实添加了这段代码:
private DatePickerDialog.OnDateSetListener mDateListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int month, int day) {
updateDate(year, month, day);
}
};
public void updateDate(int year, int month, int day) {
TextView bdate = (TextView)findViewById(R.id.birthDate);
Date chosenDate = new Date(year, month, day);
java.text.DateFormat dateFormat = DateFormat.getDateFormat(getApplicationContext());
bdate.setText(dateFormat.format(chosenDate));
} …Run Code Online (Sandbox Code Playgroud) 当我通过App-Change按钮再次打开一个关闭的应用程序时,我收到此错误消息:
Caused by: java.lang.InstantiationException: can't instantiate class com.*.FragmentContact$1; no empty constructor
Run Code Online (Sandbox Code Playgroud)
我已经找到了几个关于Inner-Classes的技巧并使它们成为静态等等.但是这个FragmentContact是一个*.java文件中的公共类,并且有一个公共的空构造函数.我在这个项目中使用谷歌地图Api v2,并在互联网上的某个地方设置我的MapView.看这里:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_contact, null);
try {
MapsInitializer.initialize(this.getActivity().getApplicationContext());
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}
fragment = new SupportMapFragment() {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mMap = fragment.getMap();
if (mMap != null) {
setupMap();
}
}
};
getFragmentManager().beginTransaction().replace(R.id.fragment_orte_map_parent, fragment).commit();
return v;
}
Run Code Online (Sandbox Code Playgroud)
当我剪切这个MapView东西时,一切正常.也许有人可以解释我做错了什么.
我完整的Stacktrace:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable …Run Code Online (Sandbox Code Playgroud) 我的课程扩展DialogFragment如下:
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
EditText editDate;
private Calendar dateTime = Calendar.getInstance();
private SimpleDateFormat dateFormatter = new SimpleDateFormat("dd MMMM yyyy");
public DatePickerFragment(EditText editText) {
editDate = editText;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return …Run Code Online (Sandbox Code Playgroud) 我有一个Fragment(它不是一个内部类,它没有任何构造函数)
public class PreferenceListFragment extends ListFragment implements OnClickListener
Run Code Online (Sandbox Code Playgroud)
我在Android Developer Console上收到此崩溃报告:
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.redacted.redacted/com.redacted.redacted.PreferenceActivity}:
android.support.v4.app.Fragment$InstantiationException:
Unable to instantiate fragment com.redacted.redacted.PreferenceListFragment$3:
make sure class name exists, is public, and has an empty constructor that is
public
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1750)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1766)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2960)
at android.app.ActivityThread.access$1600(ActivityThread.java:127)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:945)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3818)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:633)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.support.v4.app.Fragment$InstantiationException:
Unable to instantiate fragment com.redacted.redacted.PreferenceListFragment$3:
make sure class name …Run Code Online (Sandbox Code Playgroud) 我正在处理地图apiv2.编码Dialog Fragment类时出现以下错误.
错误:
Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead:
这是代码:
public PlaceDialogFragment(){
super();
}
public PlaceDialogFragment(Place place, DisplayMetrics dm){
super();
this.mPlace = place;
this.mMetrics = dm;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助都值得赞赏..
修改:这是整个代码...我是一个新手,从来没有处理过碎片.我正在通过地图啧啧发现这个......你现在详细说明了你想要解释的事情.
package com.example.travelplanner;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewFlipper;
// Defining DialogFragment class to show …Run Code Online (Sandbox Code Playgroud) 我知道这里有很多关于这方面的话题.我也多次阅读文档,但我找不到将数据从活动传递到片段的最佳方法.
我希望能够使用带选项卡的滑动视图在两个不同的布局(列表和地图)中显示我的可搜索活动的结果.我必须将2个数据传递给片段:"currentLocation"是当前用户位置,"result"是对象列表.
我已经省略了代码的某些部分,以使其更容易理解.
SearchableActivity.java
public class SearchableActivity extends ActionBarActivity implements TabListener {
List<PlaceModel> result = new ArrayList<PlaceModel>();
private SearchView mSearchView;
private String currentLocation;
AppSectionsPagerAdapter mAppSectionsPagerAdapter;
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_searchable);
final ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mAppSectionsPagerAdapter);
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
actionBar.addTab(actionBar.newTab().setText("List").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Map").setTabListener(this));
// get currentLocation here
handleIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
handleIntent(intent); …Run Code Online (Sandbox Code Playgroud) android android-layout android-fragments android-view android-tabs
片段中有默认构造函数,我想知道它的用途以及它提供的功能?我在没有它的情况下运行代码它工作得很好,我在删除它时找不到任何错误
public class SongListFragment extends Fragment {
private static final String SONG_IDS = "song_ids";
// TODO: Rename and change types of parameters
private int[] songIds;
private OnFragmentInteractionListener mListener;
public SongListFragment() {
// Required empty public constructor
}
// TODO: Rename and change types and number of parameters
public static SongListFragment newInstance(int[] songIds) {
SongListFragment fragment = new SongListFragment();
Bundle args = new Bundle();
args.putIntArray(SONG_IDS, songIds);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) …Run Code Online (Sandbox Code Playgroud) 对于我的Android项目,我需要全局单例Cache对象来通过应用程序访问有关用户的数据.
当应用程序进入后台并且在使用其他应用程序一段时间后我尝试在Cache对象中打开应用程序变量时出现问题.当我杀死应用程序并再次打开它时,一切都很好.我正在使用依赖注入来访问Cache对象.如果发生这种情况,为什么app不会再次启动?是否有一些注释可以在低内存条件下保持缓存变量?
这是我的Cache类
class Cache {
var categories : Array<BaseResponse.Category>? = null
var user : BaseResponse.User? = null
var options : BaseResponse.OptionsMap? = null
var order: MenuOrderDataModel? = null
}
Run Code Online (Sandbox Code Playgroud)
这是DI的存储模块
@Module class StorageModule {
@Singleton @Provides fun getSharedPrefs(context: Context): SharedPreferences {
return PreferenceManager.getDefaultSharedPreferences(context)
}
@Singleton @Provides fun getCache() : Cache = Cache()
}
Run Code Online (Sandbox Code Playgroud)
我注入对象@Inject lateinit var cache: Cache,然后在启动画面中填充用户数据.
编辑 - 从应用程序和启动活动添加的代码片段
class MyApp : Application() {
val component: ApplicationComponent by lazy {
DaggerApplicationComponent
.builder()
.appModule(AppModule(this))
.build()
} …Run Code Online (Sandbox Code Playgroud) 我一直在使用 React Native 0.60.4 为 android 和 ios 开发一个应用程序,最近我发现将应用程序置于分屏或自由格式模式(因为它是屏幕上唯一的应用程序)有时会导致它崩溃。
我进一步玩了这个,发现我可以毫无问题地将应用程序启动到分屏或自由格式模式,但有时调整它的大小会导致它崩溃。下面是我在 Android Studio 中的调试器实例的输出,我正在努力理解:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myApp, PID: 32150
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myApp/com.myApp.MainActivity}: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.swmansion.rnscreens.Screen$ScreenFragment: calling Fragment constructor caused an exception
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:5279)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5187)
at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:69)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.swmansion.rnscreens.Screen$ScreenFragment: calling Fragment constructor caused …Run Code Online (Sandbox Code Playgroud) 我似乎无法设置我的DateTimeDialogFragment,因为它在我放置的部分不断崩溃:
datePicker = (DatePicker) getView().findViewById(R.id.DatePicker);
Run Code Online (Sandbox Code Playgroud)
错误日志:
02-14 21:38:43.262: E/AndroidRuntime(2435): FATAL EXCEPTION: main
02-14 21:38:43.262: E/AndroidRuntime(2435): java.lang.NullPointerException
02-14 21:38:43.262: E/AndroidRuntime(2435): at com.test.DateTimeDialogFragment.onActivityCreated(DateTimeDialogFragment.java:98)
02-14 21:38:43.262: E/AndroidRuntime(2435): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:847)
02-14 21:38:43.262: E/AndroidRuntime(2435): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
02-14 21:38:43.262: E/AndroidRuntime(2435): at android.app.BackStackRecord.run(BackStackRecord.java:622)
02-14 21:38:43.262: E/AndroidRuntime(2435): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382)
02-14 21:38:43.262: E/AndroidRuntime(2435): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
02-14 21:38:43.262: E/AndroidRuntime(2435): at android.os.Handler.handleCallback(Handler.java:605)
02-14 21:38:43.262: E/AndroidRuntime(2435): at android.os.Handler.dispatchMessage(Handler.java:92)
02-14 21:38:43.262: E/AndroidRuntime(2435): at android.os.Looper.loop(Looper.java:137)
02-14 21:38:43.262: E/AndroidRuntime(2435): at android.app.ActivityThread.main(ActivityThread.java:4424)
02-14 21:38:43.262: E/AndroidRuntime(2435): at java.lang.reflect.Method.invokeNative(Native Method)
02-14 21:38:43.262: E/AndroidRuntime(2435): at java.lang.reflect.Method.invoke(Method.java:511)
02-14 21:38:43.262: E/AndroidRuntime(2435): …Run Code Online (Sandbox Code Playgroud) 我读了很多文章和 StackOverflow 答案,但仍然无法理解为什么我们需要工厂方法来创建 Fragment 的实例。
以下 Fragment 类都可以正常工作。
具有两个构造函数的片段:
public class CtorFragment extends Fragment {
private static final String KEY = "the_key";
public CtorFragment() {
// Android calls the default constructor so default constructor must be explicitly defined.
// As we have another constructor, Android won't create a default constructor for us.
}
public CtorFragment(String s) {
// Set the arguments.
Bundle bundle = new Bundle();
bundle.putString(KEY, s);
setArguments(bundle);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle …Run Code Online (Sandbox Code Playgroud) android ×13
constructor ×2
fragment ×2
java ×2
android-tabs ×1
android-view ×1
androidx ×1
caching ×1
dagger-2 ×1
datepicker ×1
google-maps ×1
kotlin ×1
react-native ×1
recreate ×1