android 片段中的 findViewById
findViewById in fragment in android
我正在尝试在 Fragment 中初始化 ViewPager (ViewPager pager = fragmentNews.getPager()
),但它仍然为 null:
我的片段:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class NewsFragment extends Fragment {
private ViewPager pager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_news, container, false);
pager = (ViewPager) view.findViewById(R.id.sliding_pager);
return view;
}
public ViewPager setAdapterForPager(PagerAdapter adapter){
pager.setAdapter(adapter);
return pager;
}
public ViewPager getPager() {
return pager;
}
}
这是我的 MainActivity:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().add(R.id.container_for_fragments, fragmentNews).commit();
pagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
ViewPager pager = fragmentNews.getPager();
pager.setAdapter(pagerAdapter);
...
fragment_news.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="100"
tools:context=".fragments.NewsFragment">
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sliding_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="30" />
...
</LinearLayout>
但在 NewsFragment.java 中,寻呼机仍然为空。所以在启动后我得到了 RuntimeException,行中的错误:
pager.setAdapter(pagerAdapter);在 MainActivity.java
无需尝试初始化 ViewPager,该应用程序运行正常。
这里
pager.setAdapter(pagerAdapter);
行导致问题,因为 pager
是 null
。
为什么?
因为使用 NewsFragment
的两个 不同对象:一个用于调用 getPager
方法,另一个将 add
方法作为最后一个参数传递.
使用在 add
方法中传递的同一对象从 NewsFragment
片段访问视图的方法...。
很可能,片段的 onCreateView
尚未执行。向您的 Activity 添加片段需要时间。您不能假设它是在添加后立即发生的。
您可以做的是覆盖 Fragment 中的 onViewCreated
,以某种方式通知 Activity 它已创建。
此外,fragmentNews
是从哪里来的?你在交易中做了一个 new NewsFragment()
但它没有保存到 fragmentNews
所以你看起来有两个单独的片段。
编辑:
我想你可以这样做
添加您的片段:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
((MainActivity) getActivity()).viewIsCreated();
}
这在你的 activity
public void viewIsCreated() {
ViewPager pager = fragmentNews.getPager();
pager.setAdapter(pagerAdapter);
}
并从 onCreate
中删除这两行
我正在尝试在 Fragment 中初始化 ViewPager (ViewPager pager = fragmentNews.getPager()
),但它仍然为 null:
我的片段:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class NewsFragment extends Fragment {
private ViewPager pager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_news, container, false);
pager = (ViewPager) view.findViewById(R.id.sliding_pager);
return view;
}
public ViewPager setAdapterForPager(PagerAdapter adapter){
pager.setAdapter(adapter);
return pager;
}
public ViewPager getPager() {
return pager;
}
}
这是我的 MainActivity:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().add(R.id.container_for_fragments, fragmentNews).commit();
pagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
ViewPager pager = fragmentNews.getPager();
pager.setAdapter(pagerAdapter);
...
fragment_news.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="100"
tools:context=".fragments.NewsFragment">
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sliding_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="30" />
...
</LinearLayout>
但在 NewsFragment.java 中,寻呼机仍然为空。所以在启动后我得到了 RuntimeException,行中的错误:
pager.setAdapter(pagerAdapter);在 MainActivity.java
无需尝试初始化 ViewPager,该应用程序运行正常。
这里
pager.setAdapter(pagerAdapter);
行导致问题,因为 pager
是 null
。
为什么?
因为使用 NewsFragment
的两个 不同对象:一个用于调用 getPager
方法,另一个将 add
方法作为最后一个参数传递.
使用在 add
方法中传递的同一对象从 NewsFragment
片段访问视图的方法...。
很可能,片段的 onCreateView
尚未执行。向您的 Activity 添加片段需要时间。您不能假设它是在添加后立即发生的。
您可以做的是覆盖 Fragment 中的 onViewCreated
,以某种方式通知 Activity 它已创建。
此外,fragmentNews
是从哪里来的?你在交易中做了一个 new NewsFragment()
但它没有保存到 fragmentNews
所以你看起来有两个单独的片段。
编辑:
我想你可以这样做
添加您的片段:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
((MainActivity) getActivity()).viewIsCreated();
}
这在你的 activity
public void viewIsCreated() {
ViewPager pager = fragmentNews.getPager();
pager.setAdapter(pagerAdapter);
}
并从 onCreate