2017-01-31 6 views
0

Я пытаюсь решить проблему с моим приложением для Android.Android - Предотвращение дублирования окна на Intent & StartActivity

Проблема в том, что когда я запускаю новый экземпляр или класс, вызывая Intent и StartActivity, открывается дублирующее окно или представление.

Я хочу сохранить ту же активность или просмотр, но выполнить/запустить новый класс, не затрагивая представление. Цель состоит в том, чтобы просто выполнить расширенный класс, но я не хочу, чтобы он воссоздавал или открывал дублирующее представление.

Я пробовал использовать android: Launchmode = "singleTop", но не имеет никакого эффекта.

Я использовал стандартный пример ящика и классов навигации для Android. Вы увидите, что content_main.xml содержит viewswitcher, который включает в себя 2 других xml-файла, которые не требуют загрузки нового экземпляра или действия ... если это имеет смысл.

Я не уверен, что проблема связана с 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

андроид: Launchmode = «SingleTop» здесь не поможет, почему вы хотите, чтобы открыть другую деятельность вы можете управлять ею в текущей деятельности с видом на переключателе, все же вы хотите открыть другое действие без дублированного окна. В этом случае вы можете сделать прозрачный ui активности открытия.

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

или с темой @android:style/Theme.Translucent.NoTitleBar"

И заменить родительский класс для AppCompatActivity из BeaconTracking. Но все же активность BeaconTracking будет добавлена ​​в задний стек.

-1

Попробуйте использовать android: launchMode = "singleInstance" в манифесте.

+0

В общем, это ужасная идея.Специальные режимы запуска 'singleInstance' и' singleTask' обычно создают больше проблем, чем они решают, и вам нужно точно знать, что вы делаете, чтобы правильно их использовать. В этом случае использование их ничего не изменит. –

+0

Если мы правильно обрабатываем состояния активности и изучаем режимы запуска singleInstance, singleTask, то это не будет проблемой для реализации. –

+0

Нет, извините. Это просто неправильно. Это не правильное решение. Это обходной путь, который обычно не работает. Я исправил сотни людей, которые неправильно использовали эти режимы запуска. См. Мои сообщения о режиме запуска. Из опыта я могу сказать, что использование этих режимов запуска создает больше проблем, чем решает. Но удачи! –

0

У каждого Activity свои виды. Если вы не хотите открывать новые виды, вы не должны запускать новый Activity. Просто переместите функциональность вашего BeaconActivity в MainActivity.