2016-12-09 70 views
2

我見過有關通過java隱藏android應用程序導航欄的文章和文章。但是,我想知道的是如何通過全屏應用程序(遊戲)的純Android C++本地活動應用程序(無JAVA AT ALL!)刪除導航欄。 Android清單中的全屏幕隱藏頂部欄,但導航欄保持可見。隱藏純Android本地導航欄

這是我想要刪除的Navigation Bar

我已經通過書籍搜索沒有運氣,沒有真正的本地活動文檔和谷歌搜索結果在什麼都沒有。只有一些頭文件中的評論是微小的評論,甚至沒有幫助。看來關於純粹的C++ android應用程序的話題是一個黑點,但市場上出現的很多遊戲都是用C++編寫的。

我也試着設置:

AConfiguration_setNavHidden(m_app->config, ACONFIGURATION_NAVHIDDEN_YES); 

但似乎什麼也不做,其實所有的AConfiguratin_setXXX似乎什麼也不做。也許我在錯誤的地方叫它?在創建窗口後,我一直致電APP_CMD_INIT_WINDOW。我應該在哪裏調用這個函數?

+0

AFAIK,你不能不調用Java API。您可能必須使用'GetMethodID'和[相關函數]通過JNI從純C++代碼調用java方法(https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html )。 AConfiguration可能不是您所需要的 - 基於對文檔的快速瀏覽,它用於編輯Java「Configuration」對象。您需要爲'Activity'獲取'jobject',獲取'JNIEnv'並使用它來調用您的任務所需的Java方法。 – user1643723

+0

我剛剛接受了面試,我提到了這個問題,顯然他們有同樣的問題,但用純C++解決了這個問題。我忘了問他們在我離開之前是如何做到的,但聽起來好像是可能的。如果我找不到答案,我的最後手段是部分使用Java,就像普通人一樣。感謝您的輸入! – MightyMoo

+0

使用C++調用帶有JNI *的Java方法是*「純C++」,因爲您沒有編寫任何Java代碼 - 只需使用JVM C++ API調用Java方法即可。 – user1643723

回答

2

所以!如果有人很好奇,我通過微軟的一個茶壺例子找到了一個回答。這就是我想出了:

public class NameOfActivity extends NativeActivity { 

void setImmersiveSticky() { 
    View decorView = getWindow().getDecorView(); 
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN 
      | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
      | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 
      | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
      | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
      | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); 
} 

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

    int SDK_INT = android.os.Build.VERSION.SDK_INT; 
    if (SDK_INT >= 19) { 
     setImmersiveSticky(); 

     View decorView = getWindow().getDecorView(); 
     decorView.setOnSystemUiVisibilityChangeListener 
       (new View.OnSystemUiVisibilityChangeListener() { 
        @Override 
        public void onSystemUiVisibilityChange(int visibility) { 
         setImmersiveSticky(); 
        } 
       }); 
    } 
    super.onCreate(savedInstanceState); 
} 

@Override 
protected void onResume() { 
    //Hide toolbar 
    int SDK_INT = android.os.Build.VERSION.SDK_INT; 
    if (SDK_INT >= 11 && SDK_INT < 14) { 
     getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN); 
    } else if (SDK_INT >= 14 && SDK_INT < 19) { 
     getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE); 
    } else if (SDK_INT >= 19) { 
     setImmersiveSticky(); 
    } 
    super.onResume(); 
} 

}

純C++ Android開發還是使用Java,它從Android SDK目錄內源得到它。你可以做的是擴大NativeActivity的一些額外的調整。裏面的清單所有你需要做的是:

android:hasCode="true" 

,然後最importan部分是活動名稱從

 android:name="android.app.NativeActivity" 

 android:name="com.example.package.NameOfActivity" 

它仍然會稱呼的改變android main並將其設置爲像普通的本地活動一樣,但是現在它會爲您提供完全全屏。我希望這可以幫助那裏的人。我花了一天的時間尋找答案,這就是我能想到的!

好運!

+0

我從sfml,它的完整C++中找到了這個,並考慮到了舊的api版本:https://github.com/SFML/SFML/blob/fae3b65f0567f87fa9925cd42d28df15eb69e79c/src/SFML/Main/MainAndroid.cpp#L139 – user2591935