【问题标题】:Android GUI does not show upAndroid GUI 不显示
【发布时间】:2014-08-24 01:09:49
【问题描述】:

我目前正在为 android 制作一个应用程序,但我遇到了一个问题,即我从主要活动开始的新活动的 UI 没有显示。我不知道是什么问题。

这是我的第二个活动的布局 xml 文件:

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

<TableRow
    android:id="@+id/tableRow1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1" >

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
         >

        <TableLayout
            android:id="@+id/tableScrollView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:stretchColumns="yes"
            android:padding="5dp" 
            android:background="@color/gray">
        </TableLayout>
    </ScrollView>
</TableRow>

这是我的活动代码:

public class Search extends ActionBarActivity {
TableLayout tableScrollView;
String[] JSONExceptions = { "type", "em", "user_id", "id", "profilepic", "bg"};
String value;
JSONObject jObject;

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

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        value = extras.getString("id");
    }
    System.out.println(value);
    tableScrollView = (TableLayout) findViewById(R.id.tableScrollView);
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {

                jObject = getJson("http://www.tabcards.com/req/androidapi/L2o30H8JlFMtFYHW3KLxkts20ztc5Be6Z6m6v315/json/"
                            + value);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    thread.start();
    try {
        thread.join();
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                createUI(jObject);
            } catch (JSONException e) {
                e.printStackTrace();
            }               
        }

    });

    System.out.println("complete");

}

private void createUI(JSONObject jObject) throws JSONException {

    Iterator<?> keys = jObject.keys();
    int absIndex = 0;
    while( keys.hasNext() ){
        String key = (String)keys.next();
        if(!contains2(JSONExceptions , jObject.get(key))){
            String value = jObject.getString(key);
            System.out.println("level 1");
            if(value!="") {
                insertElement(key + " : " + value, absIndex++);

            }
        }
    }
}

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

private void insertElement(String data, int i) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View newRow = inflater.inflate(R.layout.row, null, false);
    newRow.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT));

    TextView dataTextView = (TextView) newRow
            .findViewById(R.id.rowTextView);
    dataTextView.setText(data);
    System.out.println(dataTextView.getText().toString());
    tableScrollView.addView(newRow, i);

}

@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();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

private InputStream downloadUrl(String urlString) throws IOException {
    URL url = new URL(urlString);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setReadTimeout(10000 /* milliseconds */);
    conn.setConnectTimeout(15000 /* milliseconds */);
    conn.setRequestMethod("GET");
    conn.setDoInput(true);
    // Starts the query
    conn.connect();
    return conn.getInputStream();
}

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

public static JSONObject getJson(String url){

    InputStream is = null;
    String result = "";
    JSONObject jsonObject = null;

    // HTTP
    try {           
        HttpClient httpclient = new DefaultHttpClient(); // for port 80 requests!
        HttpPost httppost = new HttpPost(url);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
    } catch(Exception e) {
        return null;
    }

    // Read response to string
    try {           
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
            System.out.println(line);
        }
        is.close();
        result = sb.toString().replace("[", "");                
    } catch(Exception e) {
        return null;
    }

    // Convert string to object
    try {
        jsonObject = new JSONObject(result.replace("]", ""));            
    } catch(JSONException e) {
        return null;
    }

    return jsonObject;

}

这就是我创建活动的方式:

Intent i = new Intent(getApplicationContext(), Search.class);
i.putExtra("id",searchEditText.getText().toString());
startActivity(i);

如果您需要更多信息,请告诉我。

【问题讨论】:

  • 您发布的XML 缺少最外层的&lt;/TableLayout&gt;。这个XML 文件的名称是什么?
  • 你的 Search.class 在哪里?
  • @PM77-1 search_activity.xml
  • @Nabin 第二个代码块
  • 你是从 UI 线程开始的吗?

标签: java android xml user-interface


【解决方案1】:

问题:

thread.join();

那个问题是dreadlock 你正在等待thread 完成执行,这将使你的UI线程像Thread.Sleep()一样进入阻塞状态,因此UI线程正在等待你的请求在它可以在屏幕上显示布局之前完成执行。

来自documentation

Like sleep, join responds to an interrupt by exiting with an InterruptedException.

解决方案:

只使用一个仍会等待请求的线程(createUI)并在之后执行您的createUI 方法。

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {

            jObject = getJson("http://www.tabcards.com/req/androidapi/L2o30H8JlFMtFYHW3KLxkts20ztc5Be6Z6m6v315/json/"
                        + value);
            createUI(jObject);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
thread.start();

【讨论】:

  • pastebin.com/KRRinwDj - 这是我将 createUI 方法放入该方法时遇到的错误。这就是为什么我创建了一个单独的线程(并加快了我的应用程序)。
  • 给出错误的行是tableScrollView.addView(newRow, i);
  • 我已经解决了这个问题:我在Thread“线程”中创建了一个UIThread,并将createUI(json) 移动到其中。
猜你喜欢
  • 2016-06-10
  • 2016-03-02
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2012-11-11
  • 1970-01-01
相关资源
最近更新 更多