【问题标题】:how to link two resource files in android studio?如何在android studio中链接两个资源文件?
【发布时间】:2015-10-28 14:24:47
【问题描述】:

使用 2 个资源文件(或 2 个布局)制作活动。 1个包含表单从数据库中检索arraylist和 第二在列表视图中显示该列表.. 如何链接这两个资源文件?我想使用充气机..但不知道在哪里使用它?在设置适配器之后或在 onclick() 中调用 getter 之前 这是我尝试过的:

MainActivity.java

package com.example.bsitn_000.datalist;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends Activity implements View.OnClickListener {

    private RelativeLayout layoutToAdd;
    EditText NoP;
    EditText eTime;
    EditText lTime;
    EditText date;
    Button check;

    ListView listView;
    ArrayAdapter<String> adapter;

    ArrayList<String> ResList;

    protected SQLiteDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        layoutToAdd = (RelativeLayout)findViewById(R.id.existedlayout);

        createDatabase();

        NoP = (EditText)findViewById(R.id.editText4);
        eTime = (EditText)findViewById(R.id.editText);
        lTime = (EditText)findViewById(R.id.editText2);
        date = (EditText)findViewById(R.id.editText3);

        listView = (ListView)findViewById(R.id.list_view);

        check =(Button)findViewById(R.id.button);
        check.setOnClickListener(this);

    }

    public void createDatabase() {
        db = openOrCreateDatabase("Restaurant.db", Context.MODE_PRIVATE,null);
        db.execSQL("CREATE TABLE IF NOT EXISTS reserve(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
                " NoP Text, eTime Text, lTime Text, date Text, res Text);");
    }

    public ArrayList<String> getResList(){
        String n = NoP.getText().toString();
        String e = eTime.getText().toString();
        String l = lTime.getText().toString();
        String d = date.getText().toString();
        ResList = new ArrayList<String>();

        String query = "SELECT res FROM reserve WHERE NoP = '"+n+"' AND eTime = '"+e+"'AND lTime = '"+l+"'AND date = '"+d+"'";
        Cursor cursor = db.rawQuery(query,null);
        if (cursor.moveToFirst()){
            do {
                ResList.add(cursor.getString(cursor.getColumnIndex("res")));
            }while (cursor.moveToNext());

        }
        return ResList;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void callingMore(){
        LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
        View view = inflater.inflate(R.layout.activity_mylist,null);
        layoutToAdd.addView(view);
    }


    @Override
    public void onClick(View v) {
        if (v == check){
            getResList();
            if (ResList.size()!=0){
                adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,ResList);
                listView.setAdapter(adapter);
                callingMore();
            }
            else {
                Toast.makeText(this,"no record",Toast.LENGTH_SHORT).show();

            }
        }

    }
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:id="@+id/existedlayout">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:inputType="text"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="40dp" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText2"
        android:layout_below="@+id/editText"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:inputType="text"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText3"
        android:layout_below="@+id/editText2"
        android:layout_alignRight="@+id/editText2"
        android:layout_alignEnd="@+id/editText2"
        android:inputType="text"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/c"
        android:id="@+id/button"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:background="#bbff99" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:id="@+id/editText4"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignRight="@+id/editText"
        android:layout_alignEnd="@+id/editText" />
</RelativeLayout>

activity_mylist.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_gravity="center_horizontal" />
</LinearLayout>

【问题讨论】:

  • 您可以将ListView 添加到activity_main.xml 作为孩子,只要您需要在视图中相应地调整可见性设置即可
  • 请至少在你的英语上付出一些努力。我打算建议进行编辑以修复它,但我什至没有得到你真正想要的......
  • 我希望何时按下activity_main.xml 中的“检查”按钮,它应该导航到activity_mylist.xml 以显示从数据库中检索到的列表
  • AndroidDev 这个我以前做过。它绝对有效.. 但它不能满足我的要求,所以我必须导航到另一个布局

标签: android android-layout android-listview android-inflate


【解决方案1】:

要具体回答您的在哪里您应该为 ListView 充气的问题,您应该在 设置适配器之前为 ListView 充气。

由于膨胀是在callingMore() 中完成的,而不是在listView.setAdapter(adapter); 之后调用callingMore(),您应该在设置适配器之前调用它,如下所示。

    @Override
    public void onClick(View v) {
        if (v == check){
            ResList = getResList();
            if (ResList.size()!=0){
                callingMore();
                adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,ResList);
                listView = (ListView) findViewById(R.id.listView);
                listView.setAdapter(adapter);
            }
            else {
                Toast.makeText(this,"no record",Toast.LENGTH_SHORT).show();
            }
        }

您似乎也忘记在调用listView.setAdapter(adapter)之前设置listView = (ListView) findViewById(R.id.listView);;。这将导致 NullPointerException 并且可能是您对应该在哪里进行通货膨胀感到困惑的原因。您只能在 膨胀之后使用 ID R.id.listView 获取对您的 ListView 的引用。

您还忘记将 getResList() 的返回值分配给 ResList。它应该是ResList = getResList(); 而不仅仅是getResList();

另外,onCreate() 中可能有错字,listView = (ListView)findViewById(R.id.list_view);。你可能指的是listView = (ListView)findViewById(R.id.listView);

哦,在调用More() 这两行时,

View view = inflater.inflate(R.layout.activity_mylist,null);
layoutToAdd.addView(view);

可以只替换为View view = inflater.inflate(R.layout.activity_mylist, layoutToAdd);,因为将 layoutToAdd 放在第二个参数中会将其设置为view 的父视图。

【讨论】:

  • 非常感谢您的回答...我已经 setlistView = (ListView) findViewById(R.id.listView);在 onCreate 方法中。并且拼写错误没有造成任何问题,因为我首先在 mainactivity 中检索了列表.. 运行良好但现在我希望该列表必须显示在下一个界面/布局/活动中
  • 我尝试了您的建议.. 应用程序仍然停止。怎么办?
  • 在 onCreate 中设置 listView = (ListView) findViewById(R.id.listView); 是没有用的,因为它会返回 null。此时 ListView 尚不存在,因为它尚未膨胀并附加到 Activity 的布局中。正如我提到的那样,在 onClick 中设置 listView = (ListView) findViewById(R.id.listView);,或者在执行 listView = (ListView) findViewById(R.id.listView); 之前先在 onCreate 中填充 ListView。
  • 要开始一项新活动,请参阅developer.android.com/training/basics/firstapp/…。请特别注意有关 Intents 的部分并尝试使用它们。它们会派上用场,因为您可能希望将数据(例如列表 ResList)发送到新 Activity,以填充 ListView。启动一个新的 Activity 非常基础,如果你真的想开发 Android 应用程序,我建议你阅读 Android 开发者网站上的教程,它们非常好。
  • 至于为什么要设置 listView = (ListView) findViewById(R.id.listView); onCreate 中没有用,注意 onCreate 中的setContentView(R.layout.activity_main); 行。这条线所做的是将在 activity_main.xml 中指定的布局膨胀并将其与 MainActivity 相关联。这只会对 activity_main.xml 执行一次。 activity_mylist.xml 不会被夸大或附加。对 setContentView 的后续调用将使用另一个布局覆盖 Activity 的现有布局。
【解决方案2】:

我认为在编辑文本中填写数据并点击提交按钮后,您需要一种布局。如果是这样,您可以在创建活动时首先设置布局activity_main.xml,即onCreate,一旦您填写并点击提交按钮,点击按钮更改布局,即activity_mylist.xml

例如

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

    Button btnSubmit = (Button) findViewById(R.id.button);

    btnSubmit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

           setContentView(R.layout.activity_list);
           ListView lv = (ListView) findViewById(R.id.listView);
        }     

}

这是不合适的,但如果您只想以这种方式使用它,那么您可以继续。理想情况下,您应该进行两个不同的活动,并且在单击按钮时,您应该在 Intent 的帮助下移动到新活动。希望这会有所帮助。

【讨论】:

  • 我也试过了,但是应用程序停止了,如果它移动到下一个活动,它会显示空白页而不是列表.. 你能帮我解决一下吗?放在哪里..
猜你喜欢
  • 2019-03-09
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多