Java 使用TabLayout片段[不重复]处理NavigationDrawer片段时出现问题
我有一个应用程序具有以下主要设置(不包括其他布局):Java 使用TabLayout片段[不重复]处理NavigationDrawer片段时出现问题,java,android,android-fragments,Java,Android,Android Fragments,我有一个应用程序具有以下主要设置(不包括其他布局): main_display.xml:本质上是一个抽屉设置,带有一个框架布局,我用每个视图替换它 主刷新器片段:包含TabLayout和ViewPager,以及SwipeRefreshLayout和RecyclerView[注意:此RecyclerView由从网站上刮取的数据填充] 问题Ijava.lang.NullPointerException:println需要一条消息。我不知道为什么这个变量是空的。我还收到了日志消息:E/标记周期:MP2
java.lang.NullPointerException:println需要一条消息。我不知道为什么这个变量是空的。我还收到了日志消息:E/标记周期:MP2
何时应该是MP1(也称为我的第一个选项卡标题)。现在,我也问过类似的问题,但他们没有对我有用的答案,因此我请求帮助。对于如何使此设置正确运行,如有任何建议,将不胜感激
我的main_display.xml如下所示:
我的主显示类:
最后,我的GradeRefresherFragment课程的相关部分:
注意:问题不在于我的抓取代码,因为在我添加选项卡之前,它正在处理我的NavigationDrawer片段println需要一条消息
通常意味着调用的是带有空参数的Log
方法。除此之外,还不清楚到底是什么问题。@MikeM。然而,我意识到,我不清楚为什么这个参数是空的(很抱歉,我不清楚),我在那个代码中只看到一个Log
调用,用来打印位置,而这不应该造成这种情况。请发布堆栈跟踪。@MikeM。我用我的Scraper类的doInBackground
部分更新了代码,这是Log
调用的发源地您需要从参数Bundle
中获取Scraper
的mMarkingPeriod
,而不是从newInstance()中设置的字段中获取。
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/flContent"
android:layout_width="0dp"
android:layout_height="551dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
<android.support.design.widget.NavigationView
android:id="@+id/nvView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#FF303030"
app:headerLayout="@layout/navigation_header"
app:menu="@menu/drawer_view" />
</android.support.v4.widget.DrawerLayout>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="0dp"
android:paddingTop="0dp"
tools:context="com.scyon.studentaid.MainDisplay">
<include
layout="@layout/toolbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/include" />
<android.support.design.widget.TabLayout
android:id="@+id/sliding_tabs"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:tabMode="fixed"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="8dp" />
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@android:color/white"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="16dp" />
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/refresher"
android:layout_width="0dp"
android:layout_height="wrap_content"
<com.scyon.studentaid.AnimatedRecyclerView
android:id="@+id/grade_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
</com.scyon.studentaid.AnimatedRecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
public class MarkingPeriodFragmentAdapter extends FragmentPagerAdapter {
private String [] tabTitles = new String[]{"MP1", "MP2", "MP3", "MP4"};
Context context;
public MarkingPeriodFragmentAdapter(FragmentManager fm, Context context) {
super(fm);
this.context = context;
}
@Override
public Fragment getItem(int position) {
Log.e("Position", String.valueOf(position));
return GradeRefresherFragment.newInstance(tabTitles[position]) ;
}
@Override
public int getCount() {
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
return tabTitles[position];
}
}
public class MainDisplay extends AppCompatActivity {
DrawerLayout drawerLayout;
NavigationView navigationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_display);
drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction;
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.flContent, GradeRefresherFragment.newInstance("MP1"));
fragmentTransaction.commit();
navigationView = (NavigationView)findViewById(R.id.nvView);
setupDrawerContents(navigationView);
}
@Override
public void onBackPressed() {
}
private void setupDrawerContents(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
displayView(item.getItemId());
return true;
}
});
}
private void displayView (int viewID) {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment;
FragmentTransaction fragmentTransaction;
switch (viewID) {
case R.id.nav_gradebook_fragment:
fragment = GradeRefresherFragment().newInstance("MP1");
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.flContent, fragment);
fragmentTransaction.commit();
break;
case R.id.nav_shcedule_fragment:
fragment = new ScheduleFragment();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.flContent, fragment);
fragmentTransaction.commit();
break;
case R.id.nav_logout_fragment:
Intent intent = new Intent(getApplicationContext(), LoginScreen.class);
SessionManager sessionManager = new SessionManager(getApplicationContext());
sessionManager.logout();
startActivity(intent);
break;
default:
fragment = GradeRefresherFragment().newInstance("MP1");
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.flContent, fragment);
fragmentTransaction.commit();
break;
}
drawerLayout.closeDrawers();
}
public class GradeRefresherFragment extends Fragment{
Toolbar toolbar;
DrawerLayout mDrawer;
SwipeRefreshLayout swipeRefreshLayout;
ActionBarDrawerToggle mDrawerToggle;
ViewPager viewPager;
TabLayout tabLayout;
static String mMarkingPeriod;
public static GradeRefresherFragment newInstance(String markingPeriod){
GradeRefresherFragment instance = new GradeRefresherFragment();
Bundle arguments = new Bundle();
arguments.putString("mp", markingPeriod);
instance.setArguments(arguments);
return instance;
}
@Override
public void onCreate(Bundle savedInstanceState) {
new Scraper(getArguments().getString("mp")).execute();
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.main_refresher_fragment, container, false);
toolbar = (Toolbar)view.findViewById(R.id.toolbar);
AppCompatActivity activity = ((AppCompatActivity)getActivity());
activity.setSupportActionBar(toolbar);
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mDrawer = (DrawerLayout)getActivity().findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawer, toolbar, R.string.drawer_open, R.string.drawer_close);
mDrawer.addDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();
viewPager = (ViewPager)view.findViewById(R.id.viewpager);
viewPager.setAdapter(new MarkingPeriodFragmentAdapter(getFragmentManager(), getActivity()));
tabLayout = (TabLayout)view.findViewById(R.id.sliding_tabs);
tabLayout.setupWithViewPager(viewPager);
return view;
}
private class Scraper extends AsyncTask<String, Void, Wrapper> {
String mMarkingPeriod;
public Scraper(String markingPeriod) {
mMarkingPeriod = markingPeriod;
}
@Override
protected Wrapper doInBackground(String... strings) {
Wrapper wrapper = new Wrapper();
SessionManager sessionManager = new SessionManager(getContext());
String username = sessionManager.getUsername();
String password = sessionManager.getPassword();
DataManager dataManager = new DataManager(username,password);
Map<String, String> preLoginCookies = dataManager.getPreLoginCookies();
Map<String, String> postLoginCookies = dataManager.getPostLoginCookies(preLoginCookies);
Document doc = dataManager.getMPDocument(postLoginCookies,mMarkingPeriod);
Log.e("Marking Period", mMarkingPeriod);
if (doc == null){
Log.e("doInBackground Check", "null");}
Elements elements = doc.select(".cellRight");
wrapper.document = doc;
wrapper.elements = elements;
return wrapper;
}
04-15 23:59:27.883 7127-7127/com.scyon.studentaid E/Checkpoint: IsLoggedIn: true
04-15 23:59:28.429 7127-7127/com.scyon.studentaid E/Position: 0
04-15 23:59:28.429 7127-7127/com.scyon.studentaid E/Position: 1
04-15 23:59:28.502 7127-7127/com.scyon.studentaid E/RecyclerView: No adapter attached; skipping layout
04-15 23:59:28.503 7127-7127/com.scyon.studentaid E/RecyclerView: No adapter attached; skipping layout
04-15 23:59:28.503 7127-7127/com.scyon.studentaid E/RecyclerView: No adapter attached; skipping layout
04-15 23:59:29.671 7127-7282/com.scyon.studentaid E/Marking Period: MP1
04-15 23:59:29.680 7127-7127/com.scyon.studentaid E/Checkpoint: Iterating elements
04-15 23:59:29.681 7127-7127/com.scyon.studentaid E/Checkpoint: Setting up Recycler
04-15 23:59:30.886 7127-7313/com.scyon.studentaid E/Marking Period: MP1
04-15 23:59:30.888 7127-7127/com.scyon.studentaid E/Checkpoint: Iterating elements
04-15 23:59:30.889 7127-7127/com.scyon.studentaid E/Checkpoint: Setting up Recycler
04-15 23:59:32.024 7127-7334/com.scyon.studentaid E/Marking Period: MP2
04-15 23:59:32.024 7127-7334/com.scyon.studentaid E/doInBackground Check: null
--------- beginning of crash
04-15 23:59:32.026 7127-7334/com.scyon.studentaid E/AndroidRuntime:
FATAL EXCEPTION: AsyncTask #3
Process: com.scyon.studentaid, PID: 7127
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:318)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual
method 'org.jsoup.select.Elements
org.jsoup.nodes.Document.select(java.lang.String)' on a null object reference