2017-01-31 9 views
0

私のAndroidアプリケーションで問題を解決しようとしています。Android - Intent&StartActivityでの重複ウィンドウの防止

問題は、IntentとStartActivityを呼び出して新しいインスタンスまたはクラスを開始すると、重複したウィンドウまたはビューが開くという問題です。

ビューに影響を与えずに、同じアクティビティまたはビューを保持したいが、新しいクラスを実行/実行したい。その目的は単に拡張クラスを実行することですが、再作成したり、重複したビューを開いたりしたくありません。

私はアンドロイドを使ってみました:Launchmode = "singleTop"しかし効果はありません。

私は標準的なアンドロイドのナビゲーションドロワーの例であるxmlとクラスを使用しています。 content_main.xmlには、新しいインスタンスやアクティビティをロードする必要のない2つのXMLファイルが含まれているviewswitcherが含まれていることがわかります。

BeaconTracking.javaに問題がある場合、super.onCreate(...)イベントを再度呼び出して親ビューを再度開く必要があるかどうかわかりませんか??

私は間違っていますか?

ありがとうございます!

のAndroidManifest.xml

<activity 
    android:name=".MainActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" 
    android:screenOrientation="portrait" 
    android:theme="@style/AppTheme.NoActionBar"> 
</activity> 
<activity 
    android:name=".BeaconTracking" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" 
    android:screenOrientation="portrait" 
    android:theme="@style/AppTheme"> 
</activity> 

MainActivity.java

public class MainActivity extends AppCompatActivity implements ... 

public ViewSwitcher switcher; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

... 

} 


@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == R.id.nav_vehicle_tracking) { 

    Intent intent = new Intent(getApplicationContext(), BeaconTracking.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    startActivity(intent); 

     } 
    } else if (id == R.id.nav_vehicle_info) { 
      //SWITCH TO BEACON SCREEN 
      switcher.setDisplayedChild(2); 
} 

    //CLOSE NAVIGATION DRAWER WHEN BUTTON IS PRESSED 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 

BeaconTracking.java

public class BeaconTracking extends MainActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    switcher.setDisplayedChild(1); 

} 

content_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<ViewSwitcher 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/content_frame" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

<include 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    layout="@layout/content_beacons" /> 

<include 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    layout="@layout/content_map" /> 
</ViewSwitcher> 
+0

問題を解決しましたか?私はhttps://stackoverflow.com/questions/48024740/android-activity-multiple-instance – Pablo

答えて

0

アンドロイド:=「singleTop」Launchmodeはまだ開きたい、あなたは別のアクティビティを開きたいか、なぜあなたは、ビュースイッチャーを使用して、現在の活動でそれを管理することができ、ここでは助けにはなりません重複ウィンドウのない別のアクティビティその場合、開始アクティビティの透明性を確認することができます。

<activity android:name = "BeaconTracking" 
     android:label = "@string/app_name" 
     android:theme = "@android:style/Theme.NoDisplay" > 

やテーマ@android:style/Theme.Translucent.NoTitleBar"

とそしてBeaconTrackingのAppCompatActivityに親クラスを交換してください。しかし、BeaconTrackingアクティビティはバックスタックに追加されます。

-1

マニフェストでandroid:launchMode = "singleInstance"を試してみてください。

+0

のようなものに苦しんでいます。これは一般的にひどい考えです。特別な起動モード 'singleInstance'と' singleTask'は通常、問題を解決するよりも多くの問題を作り出し、正確に使うために何をしているのかを正確に知る必要があります。この場合、それらを使用しても何も変更されません。 –

+0

アクティビティの状態を適切に処理し、singleInstance、singleTaskの起動モードについて調べると、実装に問題はありません。 –

+0

いいえ、申し訳ありません。これは間違っています。これは正しい解決策ではありません。これは通常回避できない回避策です。これらの起動モードを間違って使用した何百人もの人々を訂正しました。起動モードに関する私の記事を参照してください。経験から、これらの起動モードを使用すると、解決するよりも多くの問題が発生すると言えます。しかし、幸運! –

0

Activityには独自のビューがあります。新しいビューを開かない場合は、新しいActivityを開始しないでください。 BeaconActivityの機能をMainActivityに移動してください。

関連する問題