0

Fragment の初期化について質問し、コードを投稿しました ( Android で Fragment を使用する場合は初期化を遅らせる)。問題は解決しました。しかし、私の問題はまだ存在します。変数を取得するために呼び出すonLoad()と、 がスローされNullPointerExceptionます。でこれらの変数を初期化しますonCreateView()。だから私はライフサイクルが終わったと思います。これらの関数で A.java に情報を記録しました: onDestroyonDestroyViewonStoponDestroyViewandonStopはフラグメント A が別のフラグメントに変更されたときに呼び出されますが、is onDestroynot は呼び出されます。変:

フラグメント A に EditText があります。文字列を入力しますabc。1、ライフサイクルが終了した場合、フラグメントを A から別のフラグメントに変更してから A に戻すと、入力は空になります。しかし、そうではありません。2、ライフサイクルが終了していない場合、変数を取得できないのはなぜですか?

abcそれで、どこかに保存するものはありますか?それは何です?どこ?

Fragmentの初期化を遅らせることはできないようです。非静的変数を取得できません。

Code:
/** super class of Fragment */
public class BaseFragment extends Fragment {
    public void onLoad(Context context){
    }
}

/** */
public class AFragment extends BaseFragment{
    TextView name;
    @Override
    public View onCreateVew(...){
        name = new TextView(..);
    }
    @Override
    public void onLoad(Context context){
         // here will throw NullPointerException
         name.setText("=========");
    }
}


public class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener,ViewPager.OnPageChangeListener {
    ....
    @Override
    public Fragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.mClss.getName(), info.mArgs);
    }

    @Override
    public void onPageSelected(int position) {
        TabWidget widget = mTabHost.getTabWidget();
        int oldFocusability = widget.getDescendantFocusability();
        widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
        mTabHost.setCurrentTab(position);

        widget.setDescendantFocusability(oldFocusability);

        BaseFragment f = (BaseFragment) getItem(position);
        f.onLoad(mContext);
    }
}
4

1 に答える 1

0

しかし、私の問題はまだ存在しています。onLoad()を呼び出して変数を取得すると、NullPointerExceptionがスローされます。これらの変数をonCreateView()で初期化します。

問題は、それらのフラグメントを操作する方法にあります。より正確には、メソッドで'sメソッドonPageSelectedを呼び出して、その位置のフラグメントを見つけます(または、これがあなたがやろうとしていることだと私は考えています)。ただし、このメソッドを呼び出すと、呼び出すたびに新しいフラグメントがインスタンス化されるだけで、その位置ののフラグメントへの参照は提供されません。この新しくインスタンス化されたフラグメントはにアタッチされておらず、そのメソッドは呼び出されていないため、ビューは作成されていません。メソッドを使用してこのビューの1つにアクセスしようとすると間違っており、それがスローされます。前の回答の私のコードを使用してみてください。そのコードは、FragmentPagerAdaptergetItem()ViewPagerActivityonCreateViewonLoadNullPointerExceptionViewPagerインスタンス化され、ページとして使用されていますFragmentManager

于 2012-11-28T06:53:03.287 に答える