【问题标题】:Android: How to combine an inflated layout and non inflated layout?Android:如何结合充气布局和非充气布局?
【发布时间】:2012-10-31 14:55:07
【问题描述】:

在我的活动中,我想在顶部显示一些文本视图,然后在其下方添加一个列表视图。我尝试了各种方法但均未成功,例如 addview() 但无法使其正常工作。我的膨胀视图成为主要布局。

任何帮助将不胜感激。 基于 Ted Hopp 解决方案的 LogCat 错误

10-20 02:38:38.322: D/AndroidRuntime(1253): 关闭 VM 10-20 02:38:38.322: W/dalvikvm(1253): threadid=3: 线程以未捕获的异常退出 (group=0x4001b188) 10-20 02:38:38.322:E/AndroidRuntime(1253):未捕获的处理程序:线程主因未捕获的异常而退出 10-20 02:38:38.342: E/AndroidRuntime(1253): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.example.mycoursetimetable/com.example.mycoursetimetable.MyCourses}: java.lang.IllegalStateException: 不能将标题视图添加到列表 - setAdapter 已被调用。 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 android.app.ActivityThread.access$2200(ActivityThread.java:119) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 android.os.Handler.dispatchMessage(Handler.java:99) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 android.os.Looper.loop(Looper.java:123) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 android.app.ActivityThread.main(ActivityThread.java:4363) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 java.lang.reflect.Method.invokeNative(Native Method) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 java.lang.reflect.Method.invoke(Method.java:521) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 10-20 02:38:38.342: E/AndroidRuntime(1253): at dalvik.system.NativeStart.main(Native Method) 10-20 02:38:38.342:E/AndroidRuntime(1253):原因:java.lang.IllegalStateException:无法将标题视图添加到列表中——setAdapter 已被调用。 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 android.widget.ListView.addHeaderView(ListView.java:256) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 android.widget.ListView.addHeaderView(ListView.java:279) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 com.example.mycoursetimetable.MyCourses.onCreate(MyCourses.java:30) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 10-20 02:38:38.342: E/AndroidRuntime(1253): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 10-20 02:38:38.342: E/AndroidRuntime(1253): ... 11 更多 10-20 02:38:38.382: I/dalvikvm(1253): threadid=7: 对信号 3 做出反应 10-20 02:38:38.382: E/dalvikvm(1253): 无法打开堆栈跟踪文件'/data/anr/traces.txt': 权限被拒绝 10-20 02:38:47.463: I/Process(1253): 发送信号。 PID:1253 SIG:9

activity_my_courses

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:id="@+id/main" >

    <Button
        android:id="@+id/labelAddCourseButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="addCourseButton"
        android:padding="10dp"
        android:text="@string/CourseName" />

</LinearLayout>

课程列表

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



    <TextView
        android:id="@+id/labelModuleCode"
        android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:layout_marginLeft="10dp"
        android:text="@string/CourseName"
        android:textSize="10dp" />

     <TextView
        android:id="@+id/labelCourseType"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/CourseType"
        android:layout_marginLeft="10dp"
        android:textSize="10dp" />
</LinearLayout>

代码

public class MyCourses extends ListActivity {

    static final String TEST = "com.example.mycoursetimetable.TEST";
    String [] MODULE;

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

        LinearLayout main = (LinearLayout)this.findViewById(R.id.main);
        MODULE = getResources().getStringArray(R.array.module);
        setListAdapter(new ListArrayAdapter(this,MODULE));
        }



        public void addCourseButton (View addCourseButton) 
        {
         Intent intent = new Intent(this,AddCourse.class);
         startActivity(intent);
        }

        protected void onListItemClick(ListView l, View v, int position, long id)
        {
          super.onListItemClick(l, v, position, id);


        try {
            Class test = Class.forName("com.example.MyCourseTimeTable.AddCourse");
            Intent intent = new Intent(MyCourses.this, test);

            TextView textView = (TextView) v.findViewById(R.id.labelModuleCode);
            String module = textView.getText().toString();


            intent.putExtra(TEST,module);
            startActivity(intent);
            }   
                catch (ClassNotFoundException e)
                {
                e.printStackTrace();
                }

        }

}

class ListArrayAdapter extends ArrayAdapter<String> 
{
    //  You only need one copy of LayoutInflater
    private final LayoutInflater inflater;

    //create the ArrayAdpater
    public ListArrayAdapter(Context context, String[] test) 
    {
        super(context, R.layout.activity_my_courses, test);
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        ViewHolder holder;
        if(convertView == null) {


            // Inflate the layout that you want for each row


            convertView = inflater.inflate(R.layout.listcourses, parent, false);

            holder = new ViewHolder();
            holder.code = (TextView) convertView.findViewById(R.id.labelModuleCode);
            holder.type = (TextView) convertView.findViewById(R.id.labelCourseType);

            // Add a link for your button as well and define its OnClickListener here to, eventually...

            convertView.setTag(holder);
        }
        else 
            holder = (ViewHolder) convertView.getTag();

        String module = getItem(position);
        //set the text to the string values based on position
        holder.code.setText(module);

        //return the layout
        return convertView;
    }

    class ViewHolder {
        TextView code;
        TextView type;
    }
}

【问题讨论】:

  • 在 onCreate() 方法的开头,你没有调用 setContentView() 方法..所以难怪你找不到你的主要 LinearLayout
  • 不清楚您要做什么。您没有使用在onCreate 中分配的main 变量。此外,布局activity_my_courses 不能按原样用作ListActivity 的布局。它需要有一个ListView,属性为android:id="@android:id/list"

标签: android layout inflate


【解决方案1】:

与其尝试定义自己的活动布局,不如使用如下内容:

public class MyCourses extends ListActivity {

    static final String TEST = "com.example.mycoursetimetable.TEST";
    String [] MODULE;

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

        MODULE = getResources().getStringArray(R.array.module);
        getListView().addHeaderView(getHeader()); // must come before next line
        setListAdapter(new ListArrayAdapter(this,MODULE));
    }

    private View getHeader() {
        LayoutInflater inflater =
            (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        return inflater.inflate(R.layout.listcourses, null);
    }
    . . .
}

这将使layout/listcourses.xml 中定义的视图成为列表的标题。

【讨论】:

  • 嗨 Ted,我厌倦了与此类似的方法,但是当我在模拟器中运行活动时,出现错误,显示应用程序已意外停止。
  • 我已将 Logcat 输出添加到我的主帖中。
  • @user1544223 - 啊。那是我的错误。颠倒对addHeaderViewsetListAdapter 的调用顺序。我已经修复了我的代码以显示一个应该有效的订单。
  • 非常感谢,我花了很长时间试图弄清楚这一点。
【解决方案2】:

我猜你需要在 xml 文件中的 textviews 下面有一个&lt;ListView/&gt; android id 应该是默认的android:id\list 其次你需要在你的onCreate() 中做setContentView(YOUR LAYOUT FILE)

【讨论】: