Вызвать намерение ACTION_VIEW из другого действия

Моя проблема кажется слишком сложной для меня :/

У меня есть основная деятельность:

setContentView(R.layout.main_activity);

(...)

LinearLayout mainLinearLayout;
mainLinearLayout = (LinearLayout)findViewById(R.id.mainLinearLayout);

final JSONObject user = json_user.getJSONObject(0);

ContactListData contactList = new ContactListData();
contactList.AffLayoutData(this, user, mainLinearLayout);

Я хочу раздуть элементы в макете main_activity через класс ContactListData. Я хочу использовать для этого определенный класс, потому что мне нужно повторно использовать эту инфляцию контактов в другой части моего приложения.

Вот мой ContactListData.java:

public class ContactListData extends Activity {

    public void AffLayoutData(Context context, JSONObject contact, LinearLayout mainLinearLayout) {

        try {

            LinearLayout ll;

            // > Here, a lot of layouts are inflated in main_activity :
            ll = (LinearLayout) View.inflate(context, R.layout.contact_detail_separateur_titre, null);
            ((TextView) ll.findViewById(R.id.titre)).setText("Téléphone");

            // (...) blablabla

            // And there are buttons with OnClickListener :

            ((FrameLayout) ll.findViewById(R.id.primary_action_view_container)).setOnClickListener(mSMSActionClickListener);
            ((FrameLayout) ll.findViewById(R.id.primary_action_view_container)).setTag(contact.getString("Phone"));

            // (...) blablabla
            // Finally, last layout is inflated :
            mainLinearLayout.addView(ll);

        } catch (JSONException e) {
            e.printStackTrace();
            Log.e("GEDE JSONException", null);
        }
    }

    /** My onClickListener of previous buttons */
    protected final OnClickListener mSMSActionClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", v.getTag().toString(), null)); 
            startActivity(intent);
        }
    };

. Все накачано правильно. Но когда я нажимаю на кнопку, у меня есть эта ошибка:

04-28 23:37:51.934: W/dalvikvm(30918): threadid=1: поток завершается с необработанным исключением (группа=0x41bd3700) 04-28 23:37:51.934: E/AndroidRuntime(30918): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: main 04-28 23:37:51.934: E/AndroidRuntime(30918): java.lang.NullPointerException 04-28 23:37:51.934: E/AndroidRuntime(30918): в android.content.ContextWrapper.getApplicationContext(ContextWrapper.java: 109) 04-28 23:37:51.934: E/AndroidRuntime(30918): at biz.jchambon.gedm.ContactListData$5.onClick(ContactListData.java:302)

Я безуспешно пытался запустить Intent.ACTION_VIEW в родительском действии (статическая/нестатическая проблема...). Кто мог бы мне помочь?


person Jerry    schedule 28.04.2014    source источник


Ответы (2)


Проблема может заключаться в том, что v.getTag() является null. Чтобы получить объект тега, в представлении уже должен быть сохранен какой-либо объект.

Глядя на свой код, вы установили прослушиватель onClick для представления R.id.primary_action_view_container, но не сохранили ни одного объекта как Tag для представления.

У вас должен быть объект, сохраненный как Tag для любого вида, подобного этому.

  view.setTag(yourObject);

Таким образом, вы можете получить такой объект

 Object yourObject = view.getTag();
person Libin    schedule 29.04.2014
comment
Спасибо за Ваш ответ ; У меня была такая же идея (я забыл скопировать/вставить строку setTag). Когда я делаю Log.d(Test getTag, v.getTag().toString()) непосредственно перед startActivity(intent), я вижу, что это работает в консоли:/ - person Jerry; 29.04.2014
comment
Я понял, контекст не определен. - person Jerry; 29.04.2014

Контекст был неправильным.

Мой ContactListData.class исправлен:

public class ContactListData extends Activity {

    public Context ParentContext; // < ADDED

    public void AffLayoutData(Context context, JSONObject contact, LinearLayout mainLinearLayout) {

        ParentContext = context; // < ADDED
        LinearLayout ll;

        try {


            // INFLATION ....

        } catch (JSONException e) {
            e.printStackTrace();
            Log.e("GEDE JSONException", null);
        }
    }

И намерение OnClickListener должно вызываться следующим образом:

ParentContext.startActivity(intent);
person Jerry    schedule 29.04.2014