2013-04-21 3 views
0

У меня все еще есть проблема с простое добавление кнопки на экран и получение ее для выполнения моего кода. Прямо сейчас, я буду счастлив выбрать кнопку и получить «log, d (msg)»; работать. Проблема может быть вызвана всем моим кодом в фрагменте и/или комбинацией кнопок и списком, который я просматриваю на том же экране. Это, вероятно, очень простая проблема.Как заставить мои кнопки работать во фрагменте?

Мое приложение сначала начинается с списка прокрутки, созданного курсором из таблицы SQLite. Так что это открытый список. Выберите элемент, и я получу подробный экран, чтобы добавить, обновить или удалить. Это все работает.

Теперь я добавляю 3 кнопки над списком.

Я новичок, и книга, с которой я начал писать, создала фрагмент, поэтому экран со списком закодирован таким образом. (На экране подробно переписывается только деятельности.)

Я пробовал много вещей, но примерно три пути ниже:

В моем OnCreate метод:

"btn_Add.setOnClickListener(new View.OnClickListener()" 

Как было отмечено в недавнем - ответ - Этот фрагмент выполняет OnCreate, а затем падает с этими сообщениями:

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.dummies.android.taskreminder/com.dummies.android. 
taskreminder. EventListActivity}:Binary XML file line #34: Error inflating class fragment 

в качестве отдельного метода после OnCreate:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 

Это вызывает цикл - повторение OnCreate несколько раз, то падает с этим:

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.dummies.android.taskreminder/com.dummies.android. 
taskreminder.EventListActivity}: android.view.InflateException: 
Binary XML file line #8: Error inflating class <unknown> 

3 Я добавил это в файл XML в определении кнопки:

андроида: OnClick = "MyButton "

и

public void MyButton(View v) 
    { 
    Log.d(". . . " + v); 
    } 

Это позволило приложение для загрузки, но когда я выбрал кнопку, он разбился, когда я выбрал кнопку со следующим сообщением:

java.lang.IllegalStateException: Could not find a method MyButton(View) in the activity 

Это кусочки из фрагмента: eventListFragment.java

public class EventListFragment extends ListFragment 
            implements LoaderCallbacks<Cursor> 
    { 
    . . . . 
    List strRecord = new ArrayList(3); 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
     { 
     super.onCreate(savedInstanceState); 
     . . . . 
     setListAdapter(mAdapter); 
     getLoaderManager().initLoader(0, null, this); 
     ) 
//------------------------------------ 
// THIS IS EXAMPLE # 1 
//  java.lang.RuntimeException: Unable to start activity 
//  ComponentInfo{com.dummies.android.taskreminder/com.dummies.android.taskreminder.EventListActivity}: 
//  android.view.InflateException: Binary XML file line #34: Error inflating class fragment 

    btn_Add.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
     // you may want to perform your clicks here. 
     Log.d("EventLst","S create view btnAddEvent:" + v); 
     } 
    }); 
//------------------------------------- 


    } //----> END: public void onCreate 

//------------------------------------- 
//  THIS IS EXAMPLE #2: 
// it give me this error on initial load: 
// java.lang.RuntimeException: Unable to start activity 
// ComponentInfo{com.dummies.android.taskreminder/com.dummies.android.taskreminder.EventListActivity}: 
// android.view.InflateException: Binary XML file line #8: Error inflating class <unknown> 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
     View view = inflater.inflate(R.layout.event_list, container, false); 
     Button button = (Button) view.findViewById(R.id.btn_Add); 
     button.setOnClickListener(new OnClickListener() 
      { 
      @Override 
      public void onClick(View v) 
       { 
       Activity activity = getActivity(); 
       if (activity != null) 
        { 
        Log.d("EventLst","S create view btnAddEvent:" + v); 
        Toast.makeText(activity, "GOT button", Toast.LENGTH_LONG).show(); 
        } 
       } 
      } ); 
     return view; 
     } 
//--------------------------------------- 


    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) 
     { 
     . . . 
     while (cursor.isAfterLast() == false) 
      { 
      strRecord.add(iRecNo, strDate + ": " + strC[2]); 
      } 
     lstAdapter = new ArrayAdapter<String>(getActivity(), 
        R.layout.event_row, R.id.text1, strRecord); 
      setListAdapter(lstAdapter); 

Это основной макет: event_list.XML Примечание: андроид: OnClick = "MyButton" только в Ьгу # 3 выше

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:name="com.dummies.android.taskreminder.EventListFragment" > 

<Button android:id="@+id/btn_Add" 
    android:onClick="MyButton" 
    android:layout_width="50dp" 
    android:layout_height="30dp" 
    android:textSize="12dp" 
    android:padding="1dip" 
    android:text="@string/add" /> 

    <Button android:id="@+id/btn_Exit" 
    android:onClick="onClick" 
    android:layout_width="50dp" 
    android:layout_height="30dp" 
    android:textSize="12dp" 
    android:padding="1dip" 
    android:layout_marginLeft="5dp" 
    android:layout_toRightOf="@+id/btn_Add" 
    android:text="@string/exit" /> 

    <Button android:id="@+id/btn_Other" 
    android:layout_width="50dp" 
    android:layout_height="30dp" 
    android:textSize="12dp" 
    android:padding="1dip" 
    android:layout_marginLeft="5dp" 
    android:layout_toRightOf="@+id/btn_Exit" 
    android:text="@string/other" /> 

<fragment 
    android:name="com.dummies.android.taskreminder.EventListFragment" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/btn_Add" /> 
</RelativeLayout> 

Это строка для CRE съел список SCROW: event_row.XML

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/text1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:textSize="12dp" 
    android:padding="2dip" /> 

Luksprog запрашиваемую информацию в своем ответе, пожалуйста, должность или, по крайней мере, сделать доступными для него/нее.

Сначала я создал этот XML-файл, event_list_activity.XML, угадали немного на имя файла:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/container" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
/> 

Также добавлены строки:

<string name="container">EventContainer</string> 

Ран мое испытание, и это полный журнал: (Первые три записи из моего кода):

04-28 16:09:24.504: D/EventLst(258): X onCrt: x01strI:eventname 
04-28 16:09:24.544: D/EventLst(258): X onCrt: x02 START 
04-28 16:09:24.584: D/EventLst(258): X onCrt: x03 START 
04-28 16:09:24.624: D/AndroidRuntime(258): Shutting down VM 
04-28 16:09:24.646: W/dalvikvm(258): threadid=3: thread exiting with uncaught exception (group=0x4001b1d8) 
04-28 16:09:24.646: E/AndroidRuntime(258): Uncaught handler: thread main exiting due to uncaught exception 
04-28 16:09:24.646: W/dalvikvm(258): threadid=3: thread exiting with uncaught exception (group=0x4001b1d8) 
04-28 16:09:24.646: E/AndroidRuntime(258): Uncaught handler: thread main exiting due to uncaught exception 
04-28 16:09:25.065: E/AndroidRuntime(258): java.lang.RuntimeException: Unable to start activity 
     ComponentInfo{com.dummies.android.taskreminder/com.dummies.android.taskreminder.EventListActivity}: 
     android.view.InflateException: Binary XML file line #33: Error inflating class fragment 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
04-28 16:09:25.065: E/AndroidRuntime(258): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
04-28 16:09:25.065: E/AndroidRuntime(258): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-28 16:09:25.065: E/AndroidRuntime(258): at android.os.Looper.loop(Looper.java:123) 
04-28 16:09:25.065: E/AndroidRuntime(258): at android.app.ActivityThread.main(ActivityThread.java:4363) 
04-28 16:09:25.065: E/AndroidRuntime(258): at java.lang.reflect.Method.invokeNative(Native Method) 
04-28 16:09:25.065: E/AndroidRuntime(258): at java.lang.reflect.Method.invoke(Method.java:521) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-28 16:09:25.065: E/AndroidRuntime(258): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-28 16:09:25.065: E/AndroidRuntime(258): at dalvik.system.NativeStart.main(Native Method) 
04-28 16:09:25.065: E/AndroidRuntime(258): Caused by: android.view.InflateException: Binary XML file line #33: 
     Error inflating class fragment 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:582) 
04-28 16:09:25.065: E/AndroidRuntime(258): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618) 
04-28 16:09:25.065: E/AndroidRuntime(258): at android.view.LayoutInflater.inflate(LayoutInflater.java:407) 
04-28 16:09:25.065: E/AndroidRuntime(258): at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
04-28 16:09:25.065: E/AndroidRuntime(258): at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     com.android.internal.policy.impl.WimmWindow.setContentView(WimmWindow.java:181) 
04-28 16:09:25.065: E/AndroidRuntime(258): at android.app.Activity.setContentView(Activity.java:1622) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     com.dummies.android.taskreminder.EventListActivity.onCreate(EventListActivity.java:22) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
04-28 16:09:25.065: E/AndroidRuntime(258): ... 11 more 
04-28 16:09:25.065: E/AndroidRuntime(258): Caused by: java.lang.NullPointerException 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     com.dummies.android.taskreminder.EventListFragment.onCreate(EventListFragment.java:98) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.support.v4.app.Fragment.performCreate(Fragment.java:1437) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:877) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1066) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1168) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:280) 
04-28 16:09:25.065: E/AndroidRuntime(258): at 
     android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:558) 

Далее я добавил ваши заявления ниже и получить ошибки ниже с начала фрагмента до конца создания. Примечание. Мне также пришлось добавить: import android.support.v4.app.FragmentTransaction;

package com.dummies.android.taskreminder; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.List; 

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.view.LayoutInflater; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v4.app.FragmentTransaction; 
//* below insures that you are using the ...v4 for version android 1.6 
import android.support.v4.app.ListFragment; 
import android.support.v4.app.LoaderManager.LoaderCallbacks; 
import android.support.v4.content.CursorLoader; 
import android.support.v4.content.Loader; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.view.MenuItem; 
import android.content.ContentValues; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.Button; 
import android.widget.Toast; 
import android.util.Log; 

public class EventListFragment extends ListFragment 
            implements 
            LoaderCallbacks<Cursor> 
    { 
    private SimpleCursorAdapter mAdapter; 
    List strRecId = new ArrayList(); 

    private ListAdapter lstAdapter; 
    private Button btn_Add; 
    private Button myButton; 

    List strRecord = new ArrayList(3); 
    List strFields = new ArrayList(); 

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

//---------------------------------------------------------------   
    // assuming you use FragmentActivity 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.add(R.id.container, new EvetListFragment()); 
     ft.commit();   

// errors above: 
// For: getSupportFragmentManager() 
// "The method getSupportFragmentManager() is undefined for the type EventListFragment" 
// For: EvetListFragment()); 
// "EvetListFragment cannot be resolved to a type" 
//---------------------------------------------------------------- 

// BELOW READS FROM DATABASE AND DISPLAYS EVENTNAME 
// THEN ALLOWS UPDATE OF THEM ABD INSERT FROM EXISTING   
//  Log.d("EventLst","X onCrt: x01 START"); 

     String[] strItems = new String[] 
      { 
      EventProvider.COLUMN_EVENTNAME 
      }; 
     Log.d("EventLst","X onCrt: x01strI:" + strItems[0]);   
     int[] iCnt = new int[] 
      { 
      R.id.text1 
      }; 

     mAdapter = new SimpleCursorAdapter(getActivity(),R.layout.event_row, 
        null, strItems, iCnt, 0); 
     Log.d("EventLst","X onCrt: x02 START"); 

     setListAdapter(mAdapter); 
     getLoaderManager().initLoader(0, null, this); 

     Log.d("EventLst","X onCrt: x03 START"); 
//--------------------------------------------------------------------------------- 
// I thought this set my OnClickListener. Without this code, the application runs 
// but the buttons don't do anything 
     btn_Add.setOnClickListener(new OnClickListener() 
     { 
     @Override 
      public void onClick(View v) 
      { 
       Log.d("EventLst","S onclkBtn2" + v); 
      } 
     } ); 
//------------------------------------------------------------------------------- 

     } //----> END: public void onCreate  

Большое спасибо за вашу помощь.

ответ

0

Ваш код много проблем:

Пожалуйста, пост полный StackTrace, что InflateException говорит вам, почему этот фрагмент не может быть завышена. Наиболее вероятная причина заключается в том, что вы расширяете ListFragment и переопределяете onCreateView(), чтобы раздуть свой собственный макет, который не содержит ListView с id android.R.id.list (@android:id/list в XML-файле). Даже если это исключение не будет сброшено, ваш код по-прежнему будет терпеть неудачу, потому что вы попадете в ошибку stackoverflow, макет вашего фрагмента будет файлом макета, который содержит тот же фрагмент (который будет загружен снова и так далее ...).

Снимите:

android:name="com.dummies.android.taskreminder.EventListFragment" 

от макета. Схема должна быть такой:

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
> 

<Button android:id="@+id/btn_Add"  
    android:layout_width="50dp" <!-- you should avoid fixed sizes --> 
    android:layout_height="30dp" 
    android:textSize="12sp" <!-- use sp units for text size! --> 
    android:padding="1dip" 
    android:text="@string/add" /> 

    <Button android:id="@+id/btn_Exit" 
    android:layout_width="50dp" 
    android:layout_height="30dp" 
    android:textSize="12sp" 
    android:padding="1dip" 
    android:layout_marginLeft="5dp" 
    android:layout_toRightOf="@id/btn_Add" 
    android:text="@string/exit" /> 

    <Button android:id="@+id/btn_Other" 
    android:layout_width="50dp" 
    android:layout_height="30dp" 
    android:textSize="12sp" 
    android:padding="1dip" 
    android:layout_marginLeft="5dp" 
    android:layout_toRightOf="@id/btn_Exit" 
    android:text="@string/other" /> 

<ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/btn_Add" /> 
</RelativeLayout> 

Это будет макет для фрагмента. Раскладка для Activity будет:

<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/container" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
/> 

Чтобы добавить фрагмент (в методе onCreate()):

// assuming you use FragmentActivity 
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.add(R.id.container, new EvetListFragment()); 
ft.commit(); 

Вы могли бы заменить EventListFragment с помощью R.id.container.

В вашем EventListFragment установите OnClickListener на свои кнопки, а также ваш адаптер в ответном вызове onActivityCreated(). Атрибут onClick будет искать этот метод на уровне Activity, поэтому просто установите OnClickListener вручную.

+0

Цените ответ. Я опубликую больше, но я пошел на сайт Google, который сказал, чтобы перейти к компилятору properties/java и изменить соответствие с 1.6. Результат: «Android требует соответствия уровня компилятора 5.0 или 6.0. Вместо этого« 1.7 ». ...». W/properties grayed, не может вернуться назад, ничего не запускается ... К счастью, недавняя резервная копия и не займет много времени, чтобы вернуться туда, где я был. Однако, возможно, вы уже помогли. У меня нет Activity.xml только event_row & event_List. Поскольку список, выберите из списка работал, только кнопки не удалось, я думал, что у меня есть то, что мне нужно. Поэтому я также попробую это. – ClarkG

+0

PS: Я новичок в android, - мое первое приложение, поэтому не удивительно, что мой код плохой.Я замечаю монитор от Шарлотты, может быть, я могу купить сеанс репетиторства. Это для моего WIMMOne часы, поэтому ориентация chg, фиксированные положения и одно приложение покрывает весь маленький экран. Вот почему у меня были определенные позиции. Опять же, спасибо, будет реализовывать то, что у вас есть, и разместить больше журнала, если вы еще не решили его. Clark – ClarkG

+0

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

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