2011-12-18 8 views
0

Я пытаюсь интегрировать приложение с открытым исходным кодом в свое приложение для Android. Я сделал приложение с открытым исходным кодом в качестве приложения для библиотеки и интегрировал xml в файл манифеста android. Ошибок компиляции нет.приложение для интеграции с Android android

Первый экран является экран Логин для приложения библиотеки и когда его называют это бросает Java языки ошибку исключения класса по адресу:

m_app = (TodoApplication) getApplication(); 

исходный код loginscreen.java:

public class LoginScreen extends Activity { 

final static String TAG = LoginScreen.class.getSimpleName(); 

private TodoApplication m_app; 
private Button m_LoginButton; 
private BroadcastReceiver m_broadcastReceiver; 

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

    setContentView(R.layout.login); 

    m_app = (TodoApplication) getApplication(); 

    // supposed to help with the banding on the green background 



    findViewById(R.id.loginbackground).getBackground().setDither(true); 

    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction("com.todotxt.todotxttouch.ACTION_LOGIN"); 
    m_broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Intent i = new Intent(context, TodoTxtTouch.class); 
      startActivity(i); 
      finish(); 
     } 
    }; 
    registerReceiver(m_broadcastReceiver, intentFilter); 

    m_LoginButton = (Button) findViewById(R.id.login); 
    m_LoginButton.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      login(); 
     } 
    }); 

    //final RemoteClient remoteClient = m_app.getRemoteClientManager() 
     // .getRemoteClient(); 
    //if (remoteClient.isAuthenticated()) { 



     switchToTodolist(); 
    //} 
} 

private void switchToTodolist() { 
    Intent intent = new Intent(this, TodoTxtTouch.class); 
    startActivity(intent); 
    finish(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    unregisterReceiver(m_broadcastReceiver); 
} 


void login() { 
    final RemoteClient client = m_app.getRemoteClientManager() 
      .getRemoteClient(); 

    if (!client.isAvailable()) { 
     Log.d(TAG, "Remote service " + client.getClass().getSimpleName() 
       + " is not available; aborting login"); 
     Util.showToastLong(m_app, R.string.toast_login_notconnected); 
    } else { 
     RemoteLoginTask loginTask = client.getLoginTask(); 
     loginTask.showLoginDialog(this); 
    } 
} 

} 

Интегрированный библиотечный код в android manifest.xml:

<activity android:name="com.todotxt.todotxttouch.LoginScreen" android:label="@string/app_label" 
     android:theme="@android:style/Theme.NoTitleBar" 
     android:configChanges="keyboardHidden|orientation">  
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
      <category android:name="com.todotxt.todotxttouch.category.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" />    
     </intent-filter> 


    </activity> 

    <activity android:name="com.todotxt.todotxttouch.TodoApplication" /> 

    <activity android:name="com.todotxt.todotxttouch.Filter" android:label="Filter" 
     android:theme="@android:style/Theme.NoTitleBar" /> 
    <activity android:name="com.todotxt.todotxttouch.Preferences" android:label="@string/set_preferences" /> 
    <activity android:name="com.todotxt.todotxttouch.AddTask" android:label="@string/addtask" 
     android:theme="@android:style/Theme.NoTitleBar" 
     android:configChanges="orientation|keyboardHidden" 
     android:windowSoftInputMode="adjustResize"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
     </intent-filter> 
    </activity> 

    <activity-alias android:name="com.todotxt.todotxttouch.AddTaskShortcut" 
     android:targetActivity="com.todotxt.todotxttouch.AddTask" android:label="@string/shortcut_addtask_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.CREATE_SHORTCUT" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity-alias> 
    <activity-alias android:name="com.todotxt.todotxttouch.AddTaskShare" 
     android:targetActivity="com.todotxt.todotxttouch.AddTask" android:label="@string/share_addtask_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.SEND" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="text/plain" /> 
     </intent-filter> 
    </activity-alias> 
    <activity android:name="com.todotxt.todotxttouch.HelpActivity" 
     android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" /> 
    <activity android:name="com.todotxt.todotxttouch.TodoTxtTouch" android:theme="@android:style/Theme.NoTitleBar" 
     android:configChanges="keyboardHidden|orientation"> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <meta-data android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 

Может кто-нибудь, пожалуйста, помогите мне в понимании проблемы.

Позвольте мне объяснить далее: Я имею файл с именем Todoapplication.java .... так что класс существует ... он вызывается из LoginScreen.java в

m_app = (TodoApplication) getApplication(); 

, и именно там я получение исключения класса java lang?

ответ

0

Activity.getApplication() возвращает экземпляр класса приложения, который был объявлен в манифесте в элементе <application>. Я не вижу этого в вашем вставном манифестате.

Недостаточно просто класс приложения в вашем приложении. Он должен быть явно обозначен как один в манифесте.

0

Возможно, я ошибаюсь в конце палки, поэтому заранее прошу богов программирования за прощение.

Предполагая, что вы развиваетесь в Eclipse, это не простой случай наличия проекта в Eclipse с источником с открытым исходным кодом, который в свойствах проекта имеет параметр isLibrary.

В свойствах вашего проекта вы можете добавить библиотеку, а Eclipse перечислит открытый исходный код (и любые другие, у которых есть «isLibrary»). Не могли бы вы просто выбрать проект с открытым исходным кодом и добавить его. Ваш проект затем добавит библиотеку и снова построит?

Чтобы получить доступ к проекту с открытым исходным кодом, теперь библиотеке, вы можете использовать операторы «import» для доступа к открытым общедоступным методам.

Хорошим примером этого процесса установки с использованием проекта библиотеки с открытым исходным кодом является Actionbar Sherlock, к которому я написал учебник youtube, который демонстрирует визуально то, что я только что написал. Его можно найти по адресу: http://www.youtube.com/watch?v=avcp6eD_X2k

Смежные вопросы