2017-08-24 9 views
0

ちょっと私はJavaとXMLを学習しており、親RelativeLayoutの中心にTextViewを設定しようとしています。TextViewをRelativeLayoutに設定しています.CENTER_OF_PARENT

package com.example.android.testerapp1; 

import android.graphics.Color; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.Gravity; 
import android.view.ViewGroup; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

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


    TextView homeScreen = new TextView(this); 
    homeScreen.setText("Welcome to Test App 001" + "\nThis TextView was created dynamically in Java!"); 
    homeScreen.setTextSize(24); 
    homeScreen.setTextColor(Color.CYAN); 
    homeScreen.setCursorVisible(true); 
    homeScreen.setPadding(16,56,16,56); 
    homeScreen.setBackgroundColor(Color.BLACK); 
    homeScreen.setGravity(Gravity.CENTER); 

    //dynamically set width to dp (converted to pixels ~600) and height to 'wrap content' 
    // convert dp amount to pixels for size 
    final float scale = getResources().getDisplayMetrics().density; 
    int pixelWidth = (int) (2000/scale + 0.5f); 

    homeScreen.setLayoutParams(new ViewGroup.LayoutParams(pixelWidth , ViewGroup.LayoutParams.WRAP_CONTENT)); 

    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)homeScreen.getLayoutParams(); 
    params.addRule(RelativeLayout.CENTER_IN_PARENT); 
    homeScreen.setLayoutParams(params); 


    setContentView(homeScreen); 
    } 
} 

私はポストのこの種のを見てきました。ここで

<?xml version="1.0" encoding="utf-8"?> 
<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" 
tools:context=".MainActivity"> 

</RelativeLayout> 

は私のJavaのである:私はここに setContentView(homeScreen)

前の最後の3行をコメントアウト私のアプリのみ負荷が私のXMLであります約10倍になりました。それらはすべて、私が正しく実装できないような解決策を持っています。私のコードの別の部分かもしれません。おそらくsetLayoutParamsを使って幅と高さを設定した場所は?

助けがあれば助かります。

答えて

0

あなたは、コンストラクタで、幅と高さを設定し、そのようにあなたが好きする必要が

Relative.LayoutParams(int width, int height) 

それを使用することができます:setContentView()コールがレイアウトを設定するために使用されることを想定している

homeScreen.setLayoutParams(width , height); 
+0

残念ながら、私は2つの 'int'を 'setLayoutParams'メソッドに渡していないというエラーが表示されます。最初はメソッドを試しましたが、https://stackoverflow.com/questions/9678785/android-setting-layoutparams -programmatically&https://stackoverflow.com/questions/4854492/setting-width-to-wrap-content-for-textview-through-code – KinectDeveloper23

0

全画面の現在のところ、アクティビティコードで行っているのは、TextViewだけを画面の完全なビューとして設定することです。アクティビティには、作成したXMLレイアウトへの参照がありません。これは、TextViewがその親が配置および測定する方法についてLayoutParamsを設定しようとしているため、最後の3行のコードが失敗する理由です。ただし、このコンテキストでは親はありません。あなたは、リソースを呼び出すように、それを調整し、あなたのActivityコードに続いて

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="home_screen_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MainActivity"/> 

:私は何をやって推薦することはそうのようActivityコードで、それへの参照を取得するためにXMLでRelativeLayoutid属性を与えていますあなたのXMLファイルのID。リソースディレクトリのレイアウトフォルダ(src/main/resources/layout/act_main.xml)にact_main.xmlという名前があると仮定した場合、をsuper()コールの後にonCreate()の最初の行として呼び出して、フレームワークでXMLを解析してそれを膨張させることができます。インスタンス化、サイズの計算を行い、他のものの中でそのコンポーネントの配置を決定する)。その後、findViewById(R.id.home_screen_layout)を使用してRelativeLayoutへの参照を取得し、新しいTextViewを作成して、すでに膨らんだレイアウトに追加することができます。注意点としては

package com.example.android.testerapp1; 

import android.graphics.Color; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.Gravity; 
import android.view.ViewGroup; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

    // make your view components private members as findViewById calls are expensive for the framework 
    private RelativeLayout homeScreenLayout; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Have the activity inflate the XML file with your RelativeLayout 
     setContentView(R.layout.act_main); 

     // Now that it is inflated, get a reference to that parent 
     homeScreenLayout = (RelativeLayout) findViewById(R.id.home_screen_layout); 

     // Dynamically create a TextView associated with this Activity's context 
     TextView homeScreen = new TextView(this); 
     homeScreen.setText("Welcome to Test App 001" + "\nThis TextView was created dynamically in Java!"); 
     homeScreen.setTextSize(24); 
     homeScreen.setTextColor(Color.CYAN); 
     homeScreen.setCursorVisible(true); 
     homeScreen.setPadding(16,56,16,56); 
     homeScreen.setBackgroundColor(Color.BLACK); 
     homeScreen.setGravity(Gravity.CENTER); 

     //dynamically set width to dp (converted to pixels ~600) and height to 'wrap content' 
     // convert dp amount to pixels for size 
     final float scale = getResources().getDisplayMetrics().density; 
     int pixelWidth = (int) (2000/scale + 0.5f); 

     // Adjust the placement in the parent 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(pixelWidth , RelativeLayout.LayoutParams.WRAP_CONTENT)  
     params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); // make sure to use the function which takes a boolean value for rules like CENTER_IN_PARENT 
     homeScreen.setLayoutParams(params); // Add these parameters to the textview 

     // Let the layout know about your newly created textview so that it can re-draw its canvas 
     homeScreenLayout.addView(homeScreen); 

    } 
} 

、私は何をやっているのを比較的容易にXMLで行うことができることを追加しますが、特別プログラムでの設定について尋ねられたことから、私は上の詳細には触れません。その側面。注私は活動のためのコードに加えられた変更:あなたには、いくつかの構造化リソースに興味があるなら、私は具体的には、XML layouts and how they interact with Activities

EDITセクションをAndroid Developer Guideをチェックアウトすることをお勧めします。主要な部分は、最初にsetContentView(int id)で空のRelativeLayout xmlを膨張させ、次にもう1つのTextViewを指定のレイアウトに追加します。私がCENTER_IN_PARENT行に関して提示したコードには小さな誤りがありました。 [docs](https://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html#addRule(int、int)によると、ブール値を使用するルールを追加するときは、addRule(int, int)バージョンの関数を使用する必要があります。

+0

これは完全な意味を持っています。しかし、私はエクササイズとしてJavaでTextViewを動的に作成しようとしているので、あなたの答えはほんの一部に役立ちます。私はTextViewをRelativeLayoutに最初に追加し、 'setContentView'をRelativeLayoutに追加する必要があると思いますか?私は 'RelativeLayout homeLayout =(RelativeLayout)findViewById(R.id.homeLayout);と' homeLayout.addView(homeScreen);を試しましたが、 'setContentView(homeLayout);'に変更しても実行されません。 – KinectDeveloper23

+0

'homeLayout.addView(homeScreen);'を使わず、自分の 'homeScreen'を完全に無視しても、それでもクラッシュします。問題は 'RelativeLayout homeLayout =(RelativeLayout)findViewById(R.id.homeLayout);' 'setContentView(homeLayout);'アプリはプレビューウィンドウから 'Hello World'を表示することさえできません。閉じます。 javaのRelativeLayoutにhomeScreenを追加して、 'setContentView(R.layout.activity_main)'を呼び出す方法はありますか? – KinectDeveloper23

+0

さて、 'RelativeLayout'を含め、すべてのレイアウトコンポーネントをプログラムで作成したい場合は、すべてのビューをインスタンス化し、' RelativeLayout'を正しい 'setContentView(Viewビュー、ViewGroup .LayoutParams param) 'call(関数のパラメータは、[here](https://developer.android.com/reference/android/app/Activity.html#setContentView(android.view.View))で説明されているとおりです)。 TextViewを動的に追加したいだけなので、 'setContentView(int id)'を呼び出し、 'findViewById()'を使って 'RelativeLayout' – shiv

関連する問題