2015-10-08 13 views
8

İlişkili bazı yayınları okuduktan sonra, bir unsuru bir Activity-View-Hierarchy'de bulmaya çalışmadan önce setContenView'a açıkça çağırmam gerektiğini biliyorum. Şişirilmiş bir görünüme sahip bir Etkinlik oluşturdum ve her şey iyi çalışıyor.setContentView ve findViewById

<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="0dp" 
android:paddingRight="0dp" 
android:paddingTop="0dp" 
android:paddingBottom="0dp" 
android:background="#B12A6D" 
tools:context=".MainActivity" 
android:orientation="vertical" 
> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="top" 
    android:background="@drawable/bg_purple_500" 
    android:layout_margin="0dp" 
    > 

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/GridLayout1" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_weight="50" 
     android:columnCount="4" 
     android:rowCount="4" 
     android:orientation="horizontal" 
     tools:context=".GridXMLActivity" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginTop="10dp" 
     > 

     <ImageView 
      android:id="@+id/my_bnt" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/icon_new_game" 
      android:contentDescription="@string/text" 
      android:layout_marginTop="10dp" 
      android:layout_marginLeft="20dp" 
      android:layout_marginRight="20dp" 
      android:layout_marginBottom="10dp" 
      /> 
</GridLayout> 

</LinearLayout> 

</RelativeLayout> 

kod:

public class MainActivity extends ActionBarActivity { 

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

    setContentView(R.layout.activity_main); 

} 


.... 

protected void method_triggered_from_UI_thread() { 

    // Inflate other layout... 
    View view = View.inflate(this, R.layout.my_layout, null) ; 
    setContentView(view); 
    ImageView btn = (ImageView) findViewById(R.id.my_bnt); 
    // btn is null... 

} 

denedim diğer küçük farklılıklar:

View mainView = findViewById(android.R.id.content); 
LayoutInflater inflater = LayoutInflater.from(this); 
View view = inflater.inflate(R.layout.my_layout, (ViewGroup) mainView, false) ; 
setContentView(view); 
ImageView btn = (ImageView) view.findViewById(R.id.my_bnt); 
sonraki xml ve kodu kullanarak bu etkinlik için başka bir görünümünü ayarlamak çalıştığınızda sorunudur

Ve her zaman btn == null olsun. Neyi yanlış yapıyorum?

Thx

+0

'ImageView btn = (ImageView) view.findViewById (R.id.my_bnt);' ilk durumda –

+0

My_layout Id my_bnt ile birlikte thr düğmesine sahip mi? – nvinayshetty

+1

'mainView' nedir? –

cevap

0

Üzgünüm, ama sadece mevcut düzenleri birinde (değil düzen-arazi ne de düzen-XLarge olarak) mevcut my_bnt id farkında değildi. Yardımınız için Thx

-2
You can't assign a view,and do findviewbyid to an activity outside oncreate, an it just won't work. 
you need to rearrange your code in 
//declare image as global variable 
ImageView btn; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle extraArgs = getIntent().getExtras(); 
String layoutname=extraArgs.get("LayoutName"); 
if(layoutname="main") 
    setContentView(R.layout.activity_main); 
else 

    setContentView(R.layout.my_layout); 
    btn = (ImageView) findViewById(R.id.my_bnt); 

} 



protected void method_triggered_from_UI_thread() 
{ 
//Call the main activity again with bundle giving view 
Intent intent = new Intent(); 
intent.setClass(this, MainActivity.class); 
intent.putExtra("LayoutName", "UR_LAYOUT_NAME"); 
startActivity(intent);/// or use startactivityforresult, 

//access btn here 
} 
+0

Cevabınızın ilk kısmı yanlıştır, aktivite sınıfınızda her yerde 'findViewById' yöntemini kullanabilir ve ayrıca 'setContentView' dışında onCreatePart' yöntemini de çağırabilirsiniz. –

+0

ActionBarActivity'den uzandığında değil! en azından kullanamadım! –

0

aynı olduğundan emin btn ve BNT musunuz?

Ben böyle yapmak istiyorum Ancak, main_activity.xml belli id ​​içinde 'dış' Düzeni vermek Fragments Google dev Fragments

kullanarak öneririm, rootView söylüyorlar. Ardından şunu çağırın:

protected void methodTriggeredFromUiThread(){ 
    LinearLayout rootView = findViewById(R.id.rootView); 
    View view = View.inflate(this, R.layout.my_layout, null) ; 
    rootView.removeAllViews(); 
    rootView.addView(view); 
    view.findViewById(R.id.my_bnt); 
} 

Parçalar kullanmak için, etkinliğinizin sahip olabileceği her görünüm türü için bir Fragment uygulayan bir sınıf oluşturun. Ana_aktiviteniz sadece bir FrameLayout (kalıcı başlıklar, sekmeler, her neyse) yanında tutulacaktır. Düğme, ana aktivite içinde bulunan ana aktivite içindeki findViewById (R.id.btn) içindeki parçanın içinde bulunduğu bir görünüm olduğundan, ana aktivitenin herhangi bir yerinde, parça yüklendiği sürece düğmeyi verecektir. activity_main.xml yere

:

<FrameLayout 
     android:id="@+id/fragmentHolder" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
    </FrameLayout> 

MainActivity.java

public class MainActivity extends Activity { 
    private FragmentManager mFragmentManager; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     loadFragment(new DemoFragment()); 
    } 
    protected void loadFragment(Fragment fragmentToLoad) { 
     FragmentTransaction fragmentTransaction = mFragmentManager 
      .beginTransaction(); 
     fragmentTransaction.replace(R.id.fragmentHolder, fragmentToLoad); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
    } 
} 

DemoFragment.java

public class DemoFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.my_layout, 
       container, false); 
    } 
} 
+0

Faaliyetlere parçacıklar oluşturmanın standart yolunu biliyorum, ancak bu durumda yalnızca bir etkinliği kullanmaya ve GUI öğelerini dinamik olarak değiştirmeye çalışıyorum (düzenleri değiştirerek) – acimutal

0

Değişimin bitmesini beklemek zorundasınız.)

View view = View.inflate(this, R.layout.my_layout, null); 
view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {   
    @Override   
    public void onGlobalLayout() {    
     // continue the initialization from here: 
     btn = (ImageView) view.findViewById(R.id.my_bnt); 
     //... 

     view.getViewTreeObserver().removeGlobalOnLayoutListener(this);   
    }  
}); 
setContentView(view); 
0

Sen (method_triggered_from_UI_thread bazı ViewGroup (FrameLayout) ve daha eklemek için R.layout.activity_main içinde, bu deneyin verebilecek kaba şişirilmiş görünüm eklemek: Bu deneyin

protected void method_triggered_from_UI_thread() { 

// Inflate other layout... 
    View view = View.inflate(this, R.layout.my_layout, null); 

// add new view to the container view in activity layout 
(ViewGroup) findViewById(R.id.container).addView(view); 

ImageView btn = (ImageView) findViewById(R.id.my_bnt); 

} 
2

LayoutInflater'ı deneyebilirsiniz.

View inflatedView = LayoutoutInflater.from(context).inflate(R.layout, null); 
setContentView(inflatedView); 

Mutlu kodlamalar

İlgili konular