Настройка скользящего меню на прослушивателе кликов

В этой программе я реализовал библиотеку скользящего меню. Проблема, с которой я сталкиваюсь сейчас, заключается в настройке прослушивателей кликов для этих меню.

Библиотека требует, чтобы меню было другим макетом, или, по крайней мере, так, как я его реализовал. Теперь я хотел бы реализовать различные прослушиватели onClick для этих опций меню.

Программа выглядит так (короткая ее часть):

menu.xml

 <RelativeLayout android:id="@+id/ask_a_question"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:layout_marginBottom="5dp"
        android:onClick="getQuestion">

        <TextView android:layout_alignParentLeft="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/ask_a_question"
            android:textColor="#ffffff"
            android:layout_marginLeft="15dp"
            android:layout_centerVertical="true"/>

        <ImageView android:layout_alignParentRight="true"
            android:contentDescription="@string/ask_a_question"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/question"
            android:layout_marginRight="15dp"/>

    </RelativeLayout>

и на его MainActivity.java программа выглядит так:

public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setBehindContentView(R.layout.menu);

        getSlidingMenu().setBehindOffset(100);

        ask_a_question = (RelativeLayout)findViewById(R.id.ask_a_question);
        ask_a_question.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                getQuestion();
            }
        });
        login = (Button)findViewById(R.id.log_in_button);
        login.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
            startActivity(new Intent("com.example.btshome.LOGINACTIVITY"));
            }
        });
    }

    public Intent getQuestion()
    {
        Intent i = new Intent("com.example.btshome.ASKPAGE");
        startActivity(i);
        return null;
    }

который возвращает следующую ошибку:

04-23 19:43:30.030: E/AndroidRuntime(845): FATAL EXCEPTION: main
04-23 19:43:30.030: E/AndroidRuntime(845): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.example.btshome.ASKPAGE }
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1545)
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1416)
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.app.Activity.startActivityForResult(Activity.java:3351)
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.app.Activity.startActivityForResult(Activity.java:3312)
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.app.Activity.startActivity(Activity.java:3522)
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.app.Activity.startActivity(Activity.java:3490)
04-23 19:43:30.030: E/AndroidRuntime(845):  at com.example.btshome.MainActivity.getQuestion(MainActivity.java:47)
04-23 19:43:30.030: E/AndroidRuntime(845):  at com.example.btshome.MainActivity$1.onClick(MainActivity.java:30)
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.view.View.performClick(View.java:4084)
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.view.View$PerformClick.run(View.java:16966)
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.os.Handler.handleCallback(Handler.java:615)
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.os.Handler.dispatchMessage(Handler.java:92)
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.os.Looper.loop(Looper.java:137)
04-23 19:43:30.030: E/AndroidRuntime(845):  at android.app.ActivityThread.main(ActivityThread.java:4745)
04-23 19:43:30.030: E/AndroidRuntime(845):  at java.lang.reflect.Method.invokeNative(Native Method)
04-23 19:43:30.030: E/AndroidRuntime(845):  at java.lang.reflect.Method.invoke(Method.java:511)
04-23 19:43:30.030: E/AndroidRuntime(845):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
04-23 19:43:30.030: E/AndroidRuntime(845):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-23 19:43:30.030: E/AndroidRuntime(845):  at dalvik.system.NativeStart.main(Native Method)

Страница манифеста:

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.btshome.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".LoginActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.example.btshome.LOGINACTIVITY"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

        <activity android:name=".SignUp"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.example.btshome.SIGNUP"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

        <activity android:name=".LoginPage"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.example.btshome.LOGINPAGE"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

        <activity
            android:name=".QuestionAsking"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="com.example.btshome.ASKPAGE" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

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


person Rakeeb Rajbhandari    schedule 23.04.2013    source источник
comment
Вам нужно использовать действия, как вы это делаете сейчас? Или вам будет достаточно просто открыть Activity?   -  person Piotr Chojnacki    schedule 23.04.2013


Ответы (2)


Вероятно, в вашем файле манифеста нет активности ASKPAGE.

В AndroidManifest.xml внутри тега application добавьте:

<activity android:name=".ASKPAGE">

РЕДАКТИРОВАТЬ:

Ваш метод getQuestion() должен выглядеть так:

public Intent getQuestion()
{
    Intent i = new Intent("com.example.btshome.ASKPAGE"); // Set an action in constructor
    i.setClass(MainActivity.this, QuestionAsking.class);  // Set an Activity class
    startActivity(i);
    return null;
}

И просто примечание - надеюсь, вы видите, что вы всегда возвращаете null в этом методе.

person Piotr Chojnacki    schedule 23.04.2013
comment
новая ошибка: 04-23 20:31:38.371: E/AndroidRuntime(892): java.lang.RuntimeException: невозможно запустить активность ComponentInfo{com.example.btshome/com.example.btshome.QuestionAsking}: java.lang. IllegalStateException: оба setBehindContentView должны вызываться в onCreate в дополнение к setContentView. - person Rakeeb Rajbhandari; 23.04.2013
comment
Что ж, теперь проблема в QuestionAsking Activity, вы должны вставить его код. - person Piotr Chojnacki; 23.04.2013
comment
я думаю, что нашел ошибку. У действия QuestionAsking не было следующих LOC: setBehindContentView(R.layout.menu); getSlidingMenu().setBehindOffset(100); - person Rakeeb Rajbhandari; 24.04.2013

Вы должны явно объявить фильтр намерений по крайней мере в одном из ваших действий, которое будет обрабатывать ваше намерение. Дополнительную информацию можно найти здесь. В качестве примера вы должны сделать что-то вроде:

 <activity
            android:name="com.example.btshome.LoginActivity">

            <intent-filter>
                <action android:name="com.example.btshome.LOGINACTIVITY" />>

                <category android:name="com.example.btshome />
</activity>
person Thomas Kaliakos    schedule 23.04.2013
comment
Да, в самом деле. Я не заметил, что вы тоже загрузили манифест. - person Thomas Kaliakos; 23.04.2013