2017-03-01 8 views
0

Androidのフラグメントからのインテンシティに問題があります。 私は、ListViewを保持するFragmentを保持するActivityを持っています。 私はListViewにonItemClickListenerを登録しました。これは、アクティビティでlistViewが正しく動作したときにうまくいきました。私はフラグメントでそれをラップする必要があった。インテントが開始しないフラグメントからのアクティビティ

getContext()の代わりにgetActivity()を呼び出すのではなく、どこでもお勧めします。これは実際に正しいアクティビティを返します。 LogCatが印刷されているので、クリックも登録されています。しかし、その意図は決して始まらない。何も起こりません。 誰かが私に迷っていることを教えてもらえますか?

_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"); 
      } 
     }); 
    } 

このコードは、抽象クラス内に住んしかし、サブクラスに移動すると、違いはありません。

は、ここに私のコードです。

これは意図を狙っているDealViewクラスである:ここで

public class DealView extends AppCompatActivity { 
    private TextView _priceView; 
    private TextView _descriptionView; 
    private TextView _titleView; 
    private TextView _storeView; 
    private ImageView _imageView; 
    private String _cityName; 

    @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_deal_view); 

      Intent fromDealSelection = getIntent(); 
      _cityName = fromDealSelection.getStringExtra("city"); 

      //Initializing the different components of the view 
      _priceView = (TextView) findViewById(R.id.priceInputDealView); 

      _descriptionView = (TextView) findViewById(R.id.dealDescriptionDealView); 

      _titleView = (TextView) findViewById(R.id.dealTitleDealView); 

      _storeView = (TextView) findViewById(R.id.storeDealView); 

      _imageView = (ImageView) findViewById(R.id.imageViewDealView); 

      _cityName = fromDealSelection.getStringExtra("city"); 

     } 

は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> 
+0

のようにそれを呼び出すことができますマニフェストファイル..? – Keerthivasan

+1

あなたはあなたのlogcatを見せることができますか? – TruongHieu

+0

getContext()use –

答えて

2

フラグメント内からの新しいアクティビティの開始が機能しないため、コードをホスティングアクティビティに移行することができます。クリーンで再利用可能な方法は、新しいファイルにInterfaceを作成することです。

public interface myInterface { 
    public void startMyIntent(Intent i); 
} 

次に、あなたのフラグメントホスティング、あなたのフラグメントのonItemClickListener

public class hostingActivity extends AppCompatActivity implements myInterface { 
    @Override 
    public void startMyIntent(Intent i) { 
     startActivity(i); 
    } 
} 

をActivityクラスでこのインターフェイスを実装する、あなたはでの活動を追加したこの

_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"); 
     } 
    }); 
} 
+0

ありがとうございました!なぜ他の方法がうまくいかなかったのか分かりませんが、これはそれです。 – Timbo

+0

@Timboあなたは歓迎です! – EarlGrey

+0

@Timboこの回答をもう一度見てみると、親アクティビティへの参照をローカル変数に保存することを決めました。それは2回必要です。この場合は本当に必要なことではありませんが、私の目ではより良い方法です。 – EarlGrey

0

断片の中から、あなたはただ使用することはできませんstartActivity()
あなたはgetActivity().startActivity(in)

_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()); 
      getActivity().startActivity(in); 
      Log.d("BASE_FRAGMENT", "Activity should have been started here"); 
     } 
    }); 
} 

もintent.setFlags(...)メソッドでHow do I start an activity from within a Fragment?

+0

これは正しい答えだと思いました。 OPはこれをチェックすべきです。 – TruongHieu

+0

ちょうどチェックしました。どちらもここでは何も起こりません。私もこの投稿を見て、昨日それを試しました – Timbo

0

変更されたコード

_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"); 
      } 
     }); 
    } 
+1

これも動作しません:(なぜ私はそれが活動を開始しないか分かりません) v.getContext()とgetActivity()は同じ参照を返しています – Timbo

0

使用FLAG_ACTIVITY_NEW_TASKを参照してください使用する必要があり。

+0

このフラグのみ – EarlGrey

関連する問題