0

Fragment1.java と Fragment2.java の 2 つのフラグメントを開始するビューページ アダプタを含む CreateActivity.java があります。Fragment1.java には listFragment セットアップがあり、ユーザーがそのリストの項目をクリックすると、ビューを Fragment2.java に切り替え、Fragment2.java (画像) 内の内容を変更したいと考えています。私がこれまでに行ったこと:

Fragment1.java で、リストビューの onClickListener を設定します。

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    mCallback.onArticleSelected(position);
    ((CreateActivity) getActivity()).mViewPager.setCurrentItem(1);
}

次に、インターフェイスを使用してメイン アクティビティ (CreateActivity) に渡します。次に、クリックされた位置のデータをバンドルとして Fragment2.java に送信します。

public void onArticleSelected(int position) {
    Bundle args = new Bundle();
    args.putInt(Fragment2.ARG_POSITION, position);
    Fragment2 fragobj = new Fragment2();
    fragobj.setArguments(args);
    Log.w("listposition", "" + position);
}

次に、setArguments メソッドをオーバーライドして、この値を Fragment2.java に呼び出しました。

    @Override
    public void setArguments(Bundle args) {
    super.setArguments(args);
    int pos = args.getInt(ARG_POSITION, position);
    Log.w("myApp", "" + pos);
}

整数の位置に従って、必要な画像を設定するにはどうすればよいですか? 画像ビューをそのように編集しようとしましたが、NPE エラー (添付) が表示されます。何か案は?

@Override
public void setArguments(Bundle args) {
    super.setArguments(args);
    int pos = args.getInt(ARG_POSITION, position);
    Log.w("myApp", "" + pos);
    iv_ttx = (ImageView) getView().findViewById(R.id.iv_ttx);
    if (pos == 0){
        iv_ttx.setImageResource(R.drawable.img1);
    } else if (pos == 1){
        iv_ttx.setImageResource(R.drawable.img2);
    }
}

LogCat:

    09-03 00:32:57.053: E/AndroidRuntime(28832): FATAL EXCEPTION: main
    09-03 00:32:57.053: E/AndroidRuntime(28832): java.lang.NullPointerException
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at com.meme.hdmeme.Fragment2.setArguments(Fragment2.java:209)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at com.meme.hdmeme.CreateActivity.onArticleSelected(CreateActivity.java:44)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at com.meme.hdmeme.Fragment1.onListItemClick(Fragment1.java:65)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at android.widget.AdapterView.performItemClick(AdapterView.java:298)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at android.widget.AbsListView.performItemClick(AbsListView.java:1102)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2751)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at android.widget.AbsListView$1.run(AbsListView.java:3425)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at android.os.Handler.handleCallback(Handler.java:725)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at android.os.Handler.dispatchMessage(Handler.java:92)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at android.os.Looper.loop(Looper.java:137)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at android.app.ActivityThread.main(ActivityThread.java:5195)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at java.lang.reflect.Method.invokeNative(Native Method)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at java.lang.reflect.Method.invoke(Method.java:511)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
    09-03 00:32:57.053: E/AndroidRuntime(28832):    at dalvik.system.NativeStart.main(Native Method)

Ps行209は次のとおりです。

    iv_ttx = (ImageView) getView().findViewById(R.id.iv_ttx);
4

2 に答える 2

0
Fragment2 fragobj = new Fragment2();
fragobj.setArguments(args);

上記の問題はsetArguments()、フレームワークがフラグメントのビューを作成する前に、フラグメントのビューに触れようとしていることです。基本的に をgetView()返すnullため、NPE です。

代わりに、関連するコードを、ビューが存在するライフ サイクル メソッドのいずれかに移動しますonCreateView() or onActivityCreated()。を呼び出すことで、設定された引数を取得できますgetArguments()

@Override public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    int pos = getArguments().getInt(ARG_POSITION, position);
    Log.w("myApp", "" + pos);
    iv_ttx = (ImageView) getView().findViewById(R.id.iv_ttx);
    iv_ttx.setImageResource(pos == 0 ? R.drawable.img1 : R.drawable.img2);
}
于 2013-09-03T00:31:22.943 に答える
0

これはエラー メッセージには表示されませんが、コードを見ると、null ポインター例外も次の場所から発生していると言えます。

iv_ttx = (ImageView) getView().findViewById(R.id.iv_ttx);

onCreateView() がフラグメント マネージャーによって呼び出される前に、ビューを取得しようとしています。

setArguments() メソッドをオーバーライドする代わりに、onCreateView メソッドでオーバーライドできます。そう:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.your_fragment_id, container, false);
    ImageView iv_ttx = view.findViewById(R.id.iv_ttx);
    int pos = getArguments().getInt(ARG_POSITION);
    if (pos == 0) {
        iv_ttx.setImageResource(R.drawable.img1);
    } else if (pos == 1){
        iv_ttx.setImageResource(R.drawable.img2);
    }
    return view;
}

それが役立つことを願っています。質問を 100% 理解していない可能性があります。

于 2013-09-03T00:31:49.860 に答える