Android 意图不从片段开始活动

Android 意图不从片段开始活动,android,listview,android-fragments,onclicklistener,Android,Listview,Android Fragments,Onclicklistener,我对Android中片段的意图有问题。 我有一个活动,它包含一个片段,而片段又包含一个ListView。 我已经向ListView注册了一个ListView侦听器,当我在活动中正确使用ListView时,这个功能运行良好。然而,我需要用碎片把它包起来 因此,我不再调用getContext()而是调用getActivity(),这是到处都推荐的。这实际上返回了正确的活动。 在打印我的日志时,单击也被注册。但意图从未开始。什么也没发生。 谁能告诉我我错过了什么吗 这是我的密码: _dealList.

我对Android中片段的意图有问题。 我有一个活动,它包含一个片段,而片段又包含一个ListView。 我已经向ListView注册了一个ListView侦听器,当我在活动中正确使用ListView时,这个功能运行良好。然而,我需要用碎片把它包起来

因此,我不再调用
getContext()
而是调用
getActivity()
,这是到处都推荐的。这实际上返回了正确的活动。 在打印我的日志时,单击也被注册。但意图从未开始。什么也没发生。 谁能告诉我我错过了什么吗

这是我的密码:

_dealList.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id)
            {
                Intent in = new Intent(getActivity(), DealView.class);
                in.putExtra("deal", position);
                in.putExtra("city", _citySearchBar.getText());
                startActivity(in);
                Log.d("BASE_FRAGMENT", "Activity should have been started here");
            }
        });
    }
以下是LogCat输出:

03/01 09:42:23: Launching app
W/System: ClassLoader referenced unknown path: /data/data/de.coding.mb.konstisapp/lib
Hot swapped changes, activity restarted
D/BASE_FRAGMENT: Activity should have been started here
D/BASE_FRAGMENT: Activity should have been started here
以下是我的AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="de.coding.mb.konstisapp">

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false"/>

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="18"/>
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".activities.GreatingsActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity
            android:name=".activities.DealSelectionActivity"
            android:label="@string/title_activity_deal_selection"
            android:parentActivityName=".activities.GreatingsActivity"
            android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="de.coding.mb.konstisapp.activities.GreatingsActivity"/>
        </activity>
        <activity
            android:name=".activities.DealCreationActivity"
            android:label="@string/title_activity_activity_deal_creation"
            android:parentActivityName=".activities.DealSelectionActivity"
            android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="de.coding.mb.konstisapp.activities.DealSelectionActivity"/>
        </activity>
        <activity android:name=".activities.DealView"
                  android:label="@string/title_activity_deal_view"
                  android:parentActivityName=".activities.DealSelectionActivity"
                  android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="de.coding.mb.konstisapp.activities.DealSelectionActivity">

            </meta-data>
        </activity>
</manifest>

从片段内部,您不能只使用
startActivity()

您必须使用
getActivity().startActivity(in)

\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=新的Intent(getActivity(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
getActivity().startActivity(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}

另请参见

从片段内部,您不能仅使用
startActivity()

您必须使用
getActivity().startActivity(in)

\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=新的Intent(getActivity(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
getActivity().startActivity(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}

另请参见更改的代码

_dealList.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
           @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id)
            {
                Intent in = new Intent(v.getContext(), DealView.class);
                in.putExtra("deal", position);
                in.putExtra("city", _citySearchBar.getText());
                startActivity(in);
                Log.d("BASE_FRAGMENT", "Activity should have been started here");
            }
        });
    }
\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=newintent(v.getContext(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
星触觉(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}

更改代码

_dealList.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
           @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id)
            {
                Intent in = new Intent(v.getContext(), DealView.class);
                in.putExtra("deal", position);
                in.putExtra("city", _citySearchBar.getText());
                startActivity(in);
                Log.d("BASE_FRAGMENT", "Activity should have been started here");
            }
        });
    }
\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=newintent(v.getContext(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
星触觉(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}

在intent.setFlags(…)方法中使用FLAG\u ACTIVITY\u NEW\u任务

\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=newintent(v.getContext(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
in.setFlag(Acitvity.FLAG\u活动\u新任务);
getActivity().startActivity(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}

在intent.setFlags(…)方法中使用FLAG\u ACTIVITY\u NEW\u任务

\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=newintent(v.getContext(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
in.setFlag(Acitvity.FLAG\u活动\u新任务);
getActivity().startActivity(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}

由于从片段中启动新活动不起作用,您可以尝试将代码迁移到宿主活动。一种干净且可重用的方法是在新文件中创建接口

public interface myInterface {
    public void startMyIntent(Intent i);
}
然后,在活动类中实现这个接口,托管您的片段

public class hostingActivity extends AppCompatActivity implements myInterface {
    @Override
    public void startMyIntent(Intent i) {
        startActivity(i);
    }
}
在片段的
侦听器中,可以这样调用它

_dealList.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View v, int position, long id)
        {
            Activity parentActivity = getActivity();
            Intent in = new Intent(parentActivity, DealView.class);
            in.putExtra("deal", position);
            in.putExtra("city", _citySearchBar.getText());
            ((myInterface)parentActivity).startMyIntent(in);
            Log.d("BASE_FRAGMENT", "Activity should have been started here");
        }
    });
}
\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Activity parentActivity=getActivity();
Intent in=新的Intent(父活动,DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
((myInterface)parentActivity).startMyContent(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}

由于从片段中启动新活动不起作用,您可以尝试将代码迁移到宿主活动。一种干净且可重用的方法是在新文件中创建接口

public interface myInterface {
    public void startMyIntent(Intent i);
}
然后,实现这个接口
_dealList.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View v, int position, long id)
        {
            Activity parentActivity = getActivity();
            Intent in = new Intent(parentActivity, DealView.class);
            in.putExtra("deal", position);
            in.putExtra("city", _citySearchBar.getText());
            ((myInterface)parentActivity).startMyIntent(in);
            Log.d("BASE_FRAGMENT", "Activity should have been started here");
        }
    });
}