5

LinearLayoutクリック時にアクティビティを開始する必要があるカスタム Java クラス (を拡張) を定義しようとしています。私のコードは次のようになります:

public ArizaSatiri(Context context/*, AttributeSet attrs , final Activity aktivite*/ , JSONObject mysql_satiri)
    {
        super(context/*, attrs*/);

        // code to initialize my view :

        final Context finalContext = context;

        this.setOnClickListener(new OnClickListener() {@Override
            public void onClick(View v) {
                Intent newIntent = new Intent(finalContext, ArizaDetaylari.class);
                finalContext.startActivity(newIntent);
            }//onClick
        });


    }

しかし、インスタンス化されたビューをクリックすると、エラーが発生します:

Calling startActivity() from outside of an Activity  context requires the  
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

コードからわかるようActivityに、コンストラクターに渡してみましたが、うまくいきました。しかし、それは正しい方法ですか?どの方法をお勧めしますか?

編集:

またsetTypeFace()、ある時点で電話する必要があります。そのためにコンテキストまたはアクティビティを使用する必要がありますか?

4

4 に答える 4

4

これを試して:

this.setOnClickListener(new OnClickListener() {@Override
        public void onClick(View v) {
            Intent newIntent = new Intent(finalContext, ArizaDetaylari.class);
            newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            finalContext.startActivity(newIntent);
        }//onClick
    });
于 2013-11-07T08:21:21.613 に答える
1

Context クラス リファレンスを見ると、Activity が間接サブクラスであることがわかります。したがって、アクティビティをコンテキストとして使用すると、コードが機能するはずです。

例えば:

public ArizaSatiri(Context context, JSONObject mysql_satiri){ ...}

ArizaSatiri コンストラクターへの呼び出しを変更できます。

new ArizaSatiri(myActivity, mysql_satiri);

それが役に立てば幸い。

于 2013-11-07T08:22:32.103 に答える
1

onAttachedToWindow()カスタム ビュー クラスにコードを配置できます。

@Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                final Context context = ArizaSatiri.this.getContext();
                Intent intent = new Intent(context , ArizaDetaylari.class);
                context.startActivity(intent);
            }
        });
    }

ビューがアクティビティに追加された後にこの関数が呼び出されるため、これは役立ちます。ビューにはその参照があります。ビューのコンストラクターは、おそらくアクティビティに追加される前に実行されるため、エラーが発生します。

これは、ビューをプログラムで作成するのではなく、xml で宣言した場合にも機能するはずです。(まだテストされていません)

于 2013-11-07T08:15:45.530 に答える
0

使用しているコンテキスト (finalContext) が ApplicationContext を参照している場合は、フラグを使用する必要があります。newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);前 に文を追加するだけです finalContext.startActivity(newIntent);

このアプローチの問題は、特にメールクライアントなどのアプリの外部で何かを開始する場合に発生します。アクティビティが完了した後でも、最近のアプリスタックに引き続き存在します。メールクライアントの場合、そこに存在し続けます。メールを送った後も

于 2013-11-07T08:32:43.550 に答える