簡體   English   中英

從類到主XML文件的SetText

[英]SetText from a Class to the main XML file

我正在嘗試在Java類中使用.setText來嘗試更改activity_main XML文件上TextView的值,到目前為止,我遇到了NullpointerExeption錯誤,並且我已經讀到由於聲明我的錯誤而導致的錯誤變量。 我怎樣才能做到這一點? 我需要先在mainActivity.java聲明它嗎?

在我的activity_main.xml上,我有一個按鈕->它會打開一個自定義listView->如果您按列表視圖上的2項->它會打開一個自定義警報對話框->它包含2個按鈕的自定義警報對話框->如果您按第二個按鈕->它必須設置activity_main.xml上的TextView的文本

任何幫助表示贊賞!

MainActivity.java

final TextView KMLabel = (TextView)findViewById(R.id.KMlabel);

activity.main.xml

   <TextView
        android:id="@+id/KMlabel"
        android:layout_alignBottom="@+id/TVKm"
        android:layout_toRightOf="@+id/TVKm"
        android:textSize="22sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#e6c009"
        android:text="KM/H"
        android:textStyle="italic"/>

custom.java

public class custom extends BaseAdapter{
Context context;
String Item[];
String SubItem[];
int flags[];
LayoutInflater inflter;

public custom(Context applicationContext, String[] Item, String[] SubItem , int[] flags) {
    this.context = context;
    this.Item = Item;
    this.SubItem = SubItem;
    this.flags = flags;
    inflter = (LayoutInflater.from(applicationContext));
}

@Override
public int getCount() {
    return Item.length;
}

@Override
public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int i) {
    return 0;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {


    view = inflter.inflate(R.layout.activity_items, null);
    //TextView Prueba = (TextView)view.findViewById(R.id.KMlabel);
    TextView item = (TextView) view.findViewById(R.id.item);
    TextView subitem = (TextView) view.findViewById(R.id.subitem);
    ImageView image = (ImageView) view.findViewById(R.id.image);
    item.setText(Item[i]);
    subitem.setText(SubItem[i]);
    image.setImageResource(flags[i]);
    return view;
}

viewdialog.java

public class ViewDialog {
public void showDialog(Activity activity, String msg){

    final Dialog dialog = new Dialog(activity);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setCancelable(false);
    dialog.setContentView(R.layout.custom_dialog);

     //I'm declaring it like this
    final TextView KMLabel = (TextView)activity.findViewById(R.id.KMlabel);

    Button dialogButton = (Button) dialog.findViewById(R.id.btn_dialog);
    dialogButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });

    Button KmPerHr = (Button)dialog.findViewById(R.id.KmPerH);
    KmPerHr.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            //and calling it this way:
            KMLabel.setText("MLL/H");
        }
    });
    dialog.show();
 }
}

LOGCAT:

FATAL EXCEPTION: main
                                                                     Process: com.example.dell.getspeed, PID: 3925
                                                                     java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                                                                         at com.example.dell.getspeed.ViewDialog$2.onClick(ViewDialog.java:38)
                                                                         at android.view.View.performClick(View.java:5721)
                                                                         at android.widget.TextView.performClick(TextView.java:10936)
                                                                         at android.view.View$PerformClick.run(View.java:22620)
                                                                         at android.os.Handler.handleCallback(Handler.java:739)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                         at android.os.Looper.loop(Looper.java:148)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:7406)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

R.id.KMlabel位於activity_main.xml因此您必須根據MainActivity引用初始化TextView。

final TextView KMLabel = (TextView)activity.findViewById(R.id.KMlabel);

編輯:

您可以為此使用回調模式:

ViewDialog:

public class ViewDialog {

    // interface for callback
    public interface OnSelectListener { 
      public void onOkSelect(); 
    } 

 OnSelectListener mOnSelectListener;

public void showDialog(Activity activity, String msg, OnSelectListener mListener){

mOnSelectListener = mListener;
final Dialog dialog = new Dialog(activity);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(false);
dialog.setContentView(R.layout.custom_dialog);

 //I'm declaring it like this
final TextView KMLabel = (TextView)activity.findViewById(R.id.KMlabel);

Button dialogButton = (Button) dialog.findViewById(R.id.btn_dialog);
dialogButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        dialog.dismiss();
    }
});

Button KmPerHr = (Button)dialog.findViewById(R.id.KmPerH);
KmPerHr.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        //pass to the implementation if not null
       if( mOnSelectListener != null){
          mOnSelectListener.onOkSelect();
        }
    }
});
dialog.show();
}

}

在MainActivity中:

// initialize interface 
 ViewDialog.OnSelectListener mOnSelectListener = new ViewDialog.OnSelectListener(){
    public void onOkSelect(){
       KMLabel.setText("MLL/H");
    }
 };
ViewDialog viewDialog  = new ViewDialog();
viewDialog.showDialog(this, "Message", mOnSelectListener);

您必須移動代碼

Button KmPerHr = (Button)dialog.findViewById(R.id.KmPerH);
    KmPerHr.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            //and calling it this way:
            KMLabel.setText("MLL/H");
        }
    });

final TextView KMLabel = (TextView)dialog.findViewById(R.id.KMlabel);
    Button dialogButton = (Button) dialog.findViewById(R.id.btn_dialog);
    dialogButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });

在dialog.show()代碼下面,因為代碼findViewById僅在彈出對話框后才起作用。

創建一個擴展到應用程序類的Global類,然后在Global中創建一個texview

Textview t = null;

然后創建兩個靜態方法來設置和獲取此textview

Public static void setT(TextView p){
   t = p;
}

並從中獲取

Public static TextView getT(){
return t;
}

在活動中設置TextView,然后從任意位置訪問此Textview,直到活動生效為止。

請嘗試以下代碼:

MainActivity類:-------

public class MainActivity extends AppCompatActivity {

private TextView KMlabel;
private Button b;
private ViewDialog vd;

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

    vd = new ViewDialog();

    KMlabel = (TextView) findViewById(R.id.KMlabel);
    b = (Button) findViewById(R.id.b);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            vd.showDialog(MainActivity.this , KMlabel , "Your Message" , "Your Text");
        }
    });
}
}

ViewDialog類:------

public class ViewDialog {

public void showDialog(Context context, final TextView v , String msg , final String text) {

    createYesNoInfoDialog(context, msg, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // do nothing
        }
    }, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            v.setText(text);
        }
    }).show();
}

private AlertDialog createYesNoInfoDialog(Context finalContext, String message,
                                                DialogInterface.OnClickListener onNoListener, DialogInterface.OnClickListener onYesListener) {
    AlertDialog a = new AlertDialog.Builder(finalContext).setTitle(
            message)
            .setNegativeButton("No", onNoListener)
            .setPositiveButton("Yes", onYesListener).create();

    return a;
}

}

demo2.xml:-----

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

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="xcxc"
    android:id="@+id/KMlabel"/>

<Button
    android:layout_width="match_parent"
    android:text="Create Dialog"
    android:layout_height="wrap_content"
    android:id="@+id/b"/>

</LinearLayout>

發生這種情況是因為您試圖在自定義警報對話框中調用TextView。 TextView僅屬於MainActivity。 您只能在MainActivity類中調用或更改它。 因此,請在下面嘗試。

MainActivity.class

public class MainActivity extends AppCompatActivity {

    private TextView KMlabel;

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


        KMlabel = (TextView) findViewById(R.id.KMlabel);

    }

    public void setTextKM(String string){
        KMlabel.setText(string);
    }


}

ViewDialog類

public class ViewDialog {
public void showDialog(Activity activity, String msg){

    final Dialog dialog = new Dialog(activity);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setCancelable(false);
    dialog.setContentView(R.layout.custom_dialog);


    Button dialogButton = (Button) dialog.findViewById(R.id.btn_dialog);
    dialogButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });

    Button KmPerHr = (Button)dialog.findViewById(R.id.KmPerH);
    KmPerHr.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            MainActivity mainActivity = new MainActivity();
            mainActivity.setTextKM("MLL/H");
        }
    });
    dialog.show();
 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM